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.
I feel like there's a way to remove this (and `Binder`) from core to make core simpler. If all data compiled to records, then a tiny set of operators would permit the desugaring of binding to simple predicates and accessors on records. 

I'd even argue that evaluation of a simple predicate should probably not be modeled in core if there's a tiny way to model that using a non-strict evaluation semantic (but I don't know if there is without thinking about it more).