Support default lengths varying based on signedness

Do this by making the length of types lazily computed, and the
default_length purely computed.

A side effect of this is that we push length and default_length up to the
top-level Type interface, and it's just null for types that don't have
lengths.