Core functional representation

Resolves #710 when merged, but not even nearly ready yet.

Not sure there is much to talk about yet, I was hoping to get a bit further with it, so everything is subject to change still.
To the extent possible, I'd be in favor of core data structures representing only the structure itself, with types and other metadata annotated on the core structure. Since we're not using fixed point data (for performance reasons), that probably implies a map-based annotation method (completely external to the data structure itself) or turning `Expr` into `Expr a`, where `a` is the type of annotation (possibly unit).