firehose: send OutdatedCursor and FutureCursor to consumers
implements spec-compliant cursor validation for subscribeRepos
(addresses bluesky-social/indigo#1328):
- OutdatedCursor: #info message frame (op: 1, t: "#info") when cursor
is older than the replay window. stream continues from oldest available.
- FutureCursor: error frame (op: -1) when cursor exceeds current seq.
connection closes.
- add firstSeq() to DiskPersist for oldest available sequence lookup
- rename encodeInfoFrame -> encodeErrorFrame (was always error format)
- add encodeInfoMessage for proper #info message frames
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>