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.
Neither Javascript nor most targets I can imagine (JVM, LLVM, Python, etc.) have any notion of pattern matching. I think high-quality, readable Javascript code can be generated solely with the "concession" for record types, which does add considerable complexity to the core but also makes it easier to generate clean JS. 

Ultimately, it would be nice to have a clean separation between products and sums, and to rely only on records for products, rather than allow "tuples". And I'd also like to eventually see removal of binder and case expressions in favor of something more fundamental. But seems like these are topics for another day when the existing code is refactored.