feat(gateway): multiplex backend SSE notifications to client sessions (#320)

The gateway now subscribes to each live backend's `/mcp` SSE stream
(via `FileRegistry` discovery) and multiplexes inbound JSON-RPC
notifications back to the originating client session.

- `SubscriberManager` owns a per-backend `BackendSubscriber` with a
  jittered exponential-backoff reconnect loop (100ms -> 10s, +/-25%)
  and a bounded pending buffer (256 events / 30s) for notifications
  that arrive before the correlation is known.
- Correlation keys: `params.progressToken` for `notifications/progress`,
  `params.job_id` for `$/dcc.jobUpdated` + `$/dcc.workflowUpdated`.
- On a successful reconnect, every client with an in-flight job on
  the restored backend receives a synthetic
  `notifications/$/dcc.gatewayReconnect` so it can re-query state.
- `handle_gateway_get` now registers a per-session sink and wraps
  the SSE stream in a `GuardedStream` RAII guard, scrubbing the
  sink + any routes bound to the session when the client disconnects.
- `tools/call` in the aggregator binds `progressToken` from the
  request's `_meta` and extracts `job_id` from the backend reply's
  `_meta.dcc.jobId` / `structuredContent.job_id`.

Tests:
- Rust unit tests in `sse_subscriber.rs` cover route registration,
  progress-token routing, job-id extraction, SSE record parsing,
  pending buffer cap/TTL, and the synthetic reconnect notification.
- Python regression `tests/test_gateway_sse.py` verifies session-id
  echo, per-session sink isolation, and resilience under concurrent
  SSE connects.

Docs: new `docs/guide/gateway.md` + AGENTS.md pointer.
