harden relay: cursor durability, fail-fast Redis, graceful shutdown master
Apply fixes from extensive code review: - exit on 'exhausted' so a supervisor restarts instead of a zombie process - advance cursor only after a successful Redis publish (no silent skips) - disable ioredis offline queue to avoid unbounded buffering during outages - persist cursor to Redis and resume from it on restart - handle SIGINT/SIGTERM with clean shutdown and final cursor write - add unhandledRejection/uncaughtException handlers - extract relay logic to src/relay.ts and add node:test coverage - enable strict TypeScript, align Node floor (v20+) with @types/node - document delivery semantics (at-least-once, Pub/Sub caveats) in README Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>