Initial commit that switches to an simpler AST

This commit is a pure refactoring, a non-functional change.
The internal have been restructured as follows:

* The AST nodes have been switched to dictionaries instead of
  classes.  In additional to getting pretty-printing for free now,
  this also makes it the AST nodes purely data, the search() behavior
  is now removed from AST nodes, effectively decoupling the AST
  representation from the execution semantics of the AST nodes.
* The search()'ing functionality has been extracted to an external
  tree visitor.  The visitor interface also allows for a generic
  mechanism for manipulating the AST in the future (i.e. AST
  rewriting for optimization, emitting byte code).
* The functions have been moved out to a separate module.  The
  interpreter now takes a dependency on the runtime functions.
  This also theoretically makes it possible for a user to add
  new functions.

The only noticeable change from this change is that function
name validation and arity validation are now at runtime instead
of compile time.  By doing this though we now allow for user
provided functions.