subscriber: add 30s keepalive pings to upstream WebSocket connections
without periodic pings, intermediate proxies (e.g. Cloudflare) kill
idle WebSocket connections after ~100s. this causes the subscriber to
disconnect after catching up on backlog, then reconnect via backoff —
matching the behavior reported by PDS operators behind Cloudflare.
spawns a ping thread per connection (same pattern as indigo relay's
consumer.go goroutine): 30s interval, closes after 4 consecutive
failures.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>