Redesign SymbolTable. Expand AST hierarchy.

## Motivation:
The compiler is built around the assumption that the AST carries detailed information about the code. Thus, there is little need for a complex `SymbolTable` with specialised classes for each `Entry` type. The main objective of this PR is to have the `SymbolTable` be as simple as possible. It should perform name disambiguation using existing AST nodes (packaged in a thin `Entry` wrapper for implementation purposes). It should signal errors using just exceptions and return values. It shouldn't (in principle) be necessary for code generation; def-use chains will have been already resolved by the time of codegen; stack frames should be designed on the AST. 

### AST:
* Attach a `NameNode` superclass to every node worth inserting to some
  kind of symbol table.

### Symbol:
* Major API redesign: Insert/Lookup AST nodes instead of identifiers.
* Redesign `Entry` as a thin wrapper around `ast.NameNode`s. Make it a private class of `SymbolTable`.
* Add lineinfo to error messages (using AST nodes).
* Add exception for reporting identifier redefinition.
* Rewrite `lookup_symbol`:
  * Drop useless `guard` parametre; always return None if the node is not found.
  * Assert correct nesting.
  * Inline `_find_name_in_current_scope`.
  * Correctly handle case where identifier is not present.
* Rewrite `insert_symbol`:
  * Create an `Entry` before inserting it.
  * Don't return anything.
  * Drop `guard` parametre; always raise an exception when identifier is redefined in same scope.
* Simplify `Scope` class.
* Drop `logger`; the semantic analyzer should notify the user of any errors caught.
* Make `hash_table` private as it should have always been.
* Make provisions for lib namespace initialization.
* Groom code.

### Symbol test:
* Add initial tests for `Scope` and `SymbolTable` APIs.
* Add initial functional tests for `SymbolTable`. Partly adresses #27.
There are three cases for the `entry.scope.nesting`. The first two are fine, the last signals an internal error:
1) It is less than `self.nesting`, therefore there is no such `entry` in the current scope.
2) It is equal to `self.nesting`, therefore this `entry` is the one sought.
3) It is *greater* than `self.nesting` which signals an inconsistent `SymbolTable` state; some previous scope failed to do its clean-up correctly.