Redesign API of type module. Use refined exceptions; drop loggers. Improve type tests.

### Type:
* Refine exception hierarhcy and use it for detailed error reporting.
* Remove `logger`s from `Table` and `Validator`, so the classes can be used in cases where line info is not available. The semantic analyzer shall be responsible for notifying the user for any errors caught.
* Simplify `Validator`; aim to turn it into a simple closure.

### Type test:
* Test new API.
* Use the new API to make tests more simple and intuitive.
* Add a bunch of new tests.

### misc:
* Remove unused imports.
Raising this exception is not part of the public API. You should only validate class hierarchy if you must.