Split struct function table into a separate file.

This substantially reduces the numer of files that depend
on `init-envs.rkt`.
Shrink serialized type representations more.

* Use helper functions to construct list types and simple function types.
  These are extremely common and their serialization is verbose.

* Split unions into numeric and non-numeric parts for serialization.
  Often numeric types have simple representations, and the union is
  polluted by one extra non-numeric type.

* Use the raw `sort` procedure to avoid keyword expansion
  NB: This doesn't affect zo size, only expanded code size.

Saves 300k on zo files in `math`.