Refactor TypeKinds, and translate Unit as NoType.

This is a long overdue refactoring and cleanup of TypeKinds.
They are now really the minimal bridge between scalac Types
and IR Types, in the sense that they adopt the structure of
IR types, but still keep a reference to the scalac Symbols.

At the same time, we have fundamentally changed the meaning
of scala.Unit when translating to the IR. It used to be
translated as UndefType, hence with an actual value which
was `undefined`. Now, it is translated as NoType, which
means that there is *no* value of type Unit at runtime. It
effectively means *void*. In the IR, trees of type NoType
can never appear in expression position.