Refactor Backend to module type S + Make functor + functor combinators
Backend.t is now abstract, backed by an internal record hidden by
the .mli. The public API exposes:
- module type S: the backend interface (read, write, exists, ...)
- Make(B : S): functor to pack a module + state into 'hash t
- Flat functions: Backend.read t h, Backend.write t h data, etc.
- Functor combinators: Cached(B), Readonly(B), Layered(U)(L)
Each backend (git_interop.Git_backend, pds_interop.Pds_backend,
Memory.Impl, Disk.Impl) is a named top-level module matching S.
Combinators compose at the module level before packing with Make.