Add new type checking errors.
Create structs to thread through the type checker.
Thread most errors through the type checker.

If a type error is discovered during type checking, it will now be
propagated up through the type checker to the programmer. This requires
threading results through the type checker, hence the large diff.