Start of SAST

Parses variable declarations and assignments.

Checks for:
- repeat declarations of variables
- variable assignments of invalid types

The current layout of the `semantic_check.ml` will probably be adjusted as we move on. It might be easier to organize if we move out classes of AST tests to their own files but we can see how it starts to form itself as we go.

Also separated the AST types from their printer methods, it becomes a lot easier to manage that way (for me at least).

---

(Travis is seemingly broken right now but all builds and tests pass locally)