Use existential GADT for store type: T : (module S with type t = 'a) * 'a -> t
Replace first-class module store with proper existential packing:
each backend provides a named module (Git_S, Mst_S, Pds_S) matching
module type S (with type t = backend state), and the store packs
the module with its state value.
Git and Mst public modules include their S implementation via
include, so Git.checkout/Git.head/etc. are available directly
alongside the constructors (init, open_, memory, disk, of_pds).