opam: extract Codec submodule
Moves the codec combinators (type 'a t, bool/int/string/ident/list/option/
map/enum/filtered/constraint_, and the File record-codec builder) out of
opam.ml into a new codec.ml. opam.ml becomes a thin facade that re-exports
Codec and defines [type 'a t = 'a Codec.t] and [module File = Codec.File]
as ergonomic aliases.
Users reach combinators via either the canonical [Opam.Codec.string] path
(uniform with Sexp.Codec) or the ergonomic [Opam.string] / [Opam.t] aliases
(backward-compatible).