playback/ops — pure buffer ops invariant table

Same asserts as examples/node/playback-ops.mjs (node-verified, 8/8): a 1 s 440 Hz sine with loop {0.25, 0.5} through halfSpeedLoop / doubleSpeedQuantzLoop / reverseSection / detectGap / closeGapLeft, plus the invalid-loop throw. The waveforms below are drawn at a FIXED samples-per-pixel scale, so the half-speed-stretched loop region (tinted) is visibly twice as wide as the original's. Audition buttons rebuild the ops with ctx.createBuffer injected as the factory — proving the ops produce genuine AudioBuffers when a browser caller asks for them.

original (1 s) — loop region tinted
halfSpeedLoop output (1.25 s) — stretched loop region tinted (2× wider)