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:
* Upgrade `FunctionDef` to `ListNode`.
* 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.
As raising these exceptions is not part of the API, we should only test for class hierarchy at this point and assert on exception attributes when they are thrown from the library.