csvt: unified GADT with String/Obj/Map cases (soup paper)
Replace separate col_codec and record-based t with a single GADT
following the recipe from Bünzli's "An alphabet for your data soups":
String for fields, Obj for rows, Map for composition. Column values
are decoded into a heterogeneous Dict keyed by Type.Id.t witnesses
and applied to the constructor via dec_fun — fully type-safe with
no Obj.repr. Also adds decode_field/encode_field and get_col query.