Add variable support

By rewriting most of this program using lex and yacc instead of handwritten lexers/parsers, I added a "let" clause that adds support for variables. The format
```
(let <var-name> <expression>)
```
evaluates <expression> and sets the result to a variable named <var-name>. The expression's output is absorbed and not evaluated farther up the syntax tree at this time. An AST of a let expression evaluates to None.

Functions are up next!