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

### Type:
* Type: Replace `Validator` class with simple functions.
* Refine exception hierarchy and use it for detailed error reporting.
* Remove `logger` from `Table`, so it 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.

### Type test:
* Test new API.
* Use the new API to make tests more simple and intuitive.
* Add a bunch of new tests. Groom old tests.

### misc:
* Remove unused imports.
Instantiating these exceptions is not part of the public type API. These tests should simply test for class hierarchy if you so wish. For attribute testing, you should assert on the attributes of the exceptions thrown from within the module in the subsequent tests.