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.
Why are you validating that exceptions can be raised from outside the module? The module is not providing such functionality as part of its public API. The only use of these exceptions should be for them to be caught.