Output statements

Again, unrelated branch name....

- `Literal` -> `IntLit`, since we have other variable types now (unlike microc)
- Refactored the test script
  - includes YACC output on failed tests now
- added support for `printf` and `println`

This'll be blocked on #50 then I'll do the merge, but please review what I changed.
So this should fail, although 

```
int x = 5;

func foo() {
    string x = "no types yet"
}
```

should pass.  The process for assigning a variable is:

1. If a type exists in the declaration jump to 3
2. search parent scope for name, if it is found in a parent scope, goto 4, else error (missing type)
3. If the name exists in locals, error (redefinition of local var).
4. If the type doesn't match the expr, typeerror 
5. assign expr to the name and add the name to locals.

this program fails:

```
int a = 5
func foo() {
    a = 4
    int a = 5
}
```