Introduce a small Loader interface so the service can stay oblivious
to the storage backend behind a Parquet path: tests inject a
LocalLoader backed by os.File, and the daemon will plug in a
filer-backed Loader in a later milestone.
FileHandle is the parser-friendly view: io.ReaderAt + io.Closer +
Size(). LocalLoader rejects missing files and directories up front so
service-level error paths see a clear "open failed" rather than a
later ReadAt EOF.
The Service does not yet consume Loader — that wiring lands in M1-C4
along with the predicate-less Pushdown handler that actually issues
loads.