Replace discrete step-snapping with YouTube-style continuous seek so
clicking the progress bar lands at the exact time position, not the
nearest step boundary.
- Add seekToTime(timeMs, stepTimeline) to useStepProgression that
derives step index + intra-step offset and resumes playback
- Thread seekOffsetRef and seekGeneration through usePlaybackProgress
so the RAF loop initialises at the click position instead of zero
- Expose seekToStep(stepIndex, offsetMs) on useNarrationPlayback to
seek the <audio> element mid-clip via loadedmetadata
- Simplify ScenarioControls: replace onSeek(index) with
onSeekToTime(timeMs) and remove unused stepIndex/lastIndex props
- Orchestrate narration + progression + coordinator in ScenarioPlayer
via handleSeekToTime
BREAKING CHANGE: ScenarioControls props replace onSeek with
onSeekToTime; stepIndex and lastIndex props removed
Made-with: Cursor