Constructs an OpcodeStep from raw VM state. Shared between the
dispatch-loop hook (pre_step_capture) and synthetic-step builders
(e.g. fused JUMPDEST under JUMP/JUMPI). Callers pass gas_cost = 0 when
they intend to patch it later in finalize_step; synthetic steps pass the
known cost directly.