perf(tiered-storage): promote streamed reads into warm and hot master
getStream never promoted, so hosting fetched a cold asset from S3 on every request until a buffered read happened, and each cold read also fired a HEAD for access stats. With eager promotion, a streamed cold hit now passes through a tee that writes each chunk to a staged file in the disk tier before handing it on, and the file is renamed into place once the source ends. Objects whose placement allows hot and that fit streamHotPromotionMaxBytes (256 KiB) are copied into hot as well; a warm hit can promote to hot the same way. Both commit through promoteIfCurrent while the read fence is held, so a write or invalidation that started after the read discards them. A stream that is destroyed, fails, or ends short of its recorded size promotes nothing and removes its staged file; leftovers from a crash are removed at startup. Cold reads no longer update access stats: on S3 that is a HEAD plus a metadata-replacing copy that can race a concurrent write. scripts/bench-stream-promotion.ts measures cold calls, latency and RSS.