feat(xrpc-server)!: add drain() to WebSocketConnection for backpressure
the router now calls `await ws.drain()` after every frame it sends so
adapters can gate on the outgoing send buffer. watermarks are
adapter-level concerns (platform-tuned), not router-level, so each
adapter accepts `highWaterMark` / `lowWaterMark` (default 250 KB / 50 KB)
via its factory options:
- Node (`ws`): polls `ws.bufferedAmount` until it drops below the low
watermark.
- Bun: same, using `ws.getBufferedAmount()`.
- Deno: same, using the native `WebSocket.bufferedAmount`.
- Cloudflare Workers: no-op; the runtime does not surface the outgoing
buffer.
without backpressure, a slow client on a high-throughput subscription
(e.g. firehose) could balloon memory in the adapter's send queue.