Wire format for POST /prefetch: Content-Type: application/x-ndjson, one
PrefetchItem JSON object per \n-terminated line. There is no wrapper
type — the body is a stream of lines, parsed and enqueued incrementally so
the server never buffers the whole batch.
Prepends a root prefix to each PrefetchItem’s key before delegating, so a
warm keyed by a lake-root-relative path (views/…) targets the same cache
key a demand read produces through object_store::PrefixStore (root/views/…).
This mirrors, for the prefetch path, what PrefixStore does for reads.
Dyn-compatible capability seam so downstream consumers that hold
Arc<dyn ObjectStore> (not CacheClientStore directly) can still drive
prefetch without downcasting.