canonicalize types, and a crude way to propagate type information

there may be better ways (see HList-0.3.0.1 hMap for example) to
allow inference with this type-level stuff to have information
flow in any (both) directions to infer a final type.