Typed C representation

Annotate the internal C representation with types, so that the OCaml type checker ensures that C code is constructed in a meaningful way.  This is an internal-only change which leaves the interface unchanged and should have no effects on generated code.

There are two regressions to fix before this can be merged:
* support for pointers into the OCaml heap.
* bindings involving view types (e.g. `funptr`) should use the associated custom type printer rather than the printer for the underlying type.