Implement subscription stage with two-connection strategy
Adds FrameStream and WebSocketClient traits for testable WebSocket
access. Implements RealWebSocketClient and RealFrameStream using
tokio-tungstenite. Implements the main subscription::run() function
with two-connection backfill + live-tail strategy, idle-gap detection,
and frame decode error tracking. Wires the subscription stage into
the pipeline driver, replacing the stub with real calls.
Fix identity test regression after subscription stage landing
Add WebSocketClient injection seam to LabelerOptions following the
raw_http_tee pattern. Exit the subscription drain loop on stream
closure (next_frame returning None), treating zero frames observed
as NoFramesWithinBudget without waiting for the full budget.
Identity integration tests inject an empty FakeWebSocketClient so the
subscription stage produces deterministic Advisory/Skipped rows in
their snapshots instead of triggering a real WebSocket connection.
All 12 identity tests now pass with updated snapshots reflecting the
new subscription stage output.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>