s3: serve VOD reads through an LRU block cache master
The bare S3 ReaderAt reopens a ranged GetObject on every non-sequential read. A demuxer seeking around a large MP4 (moov parse, interleaved audio/video, B-frame reorder) turns one VOD into tens of thousands of round-trips: replaying a real 1.4 GB read trace showed 120,230 GetObjects — which is where the multi-minute "slow VOD" wall actually came from, not the upload. Add CachingReaderAt, an LRU cache of fixed 16 MB blocks over any io.ReaderAt, and wrap S3Store.Open in it (16 MB x 10 = 160 MB/reader). It only ever issues aligned, full-block reads to the underlying reader — each a single clean sequential GET — so the same trace drops to 91 backend GETs at ~1.0x read amplification. The file backend is untouched (local random access is already free). Includes a byte-exact correctness test and a trace-replay simulation (TestCachingReaderAtSim, gated on SEEK_TRACE) used to choose the block size and cache depth. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>