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.
Sure, I don't really intend to keep `TypedValue` as a constructor, and now you mention it I should perhaps move `Meta` out too and use the `Expr a` method for all annotations.