First scratch on designing a core language

It is probably to messy!
Add translation of GHC Core into the rich language
Move tests to separate directory
Fix a bug in data pattern unification
Fix pretty-printing and make optimisation toggleable
Add a simplification pass on the rich language
Remove unnecessary dummy let-indirection
Add type info in lambdas, and allow printing without uniques
Unroll default patterns to eliminate more known cases
Work in progress on Rich to Simple pass
Almost finished work on Rich to Simple transformation
Finish translation from the rich to the simple
Use explicitly typed variables in translations

This effects core to rich and rich to simple.

The reason is that the type of arbitrary expressions is needed when
defuctionalising the program: the app function should have the argument
and result type at every point.

This actually simplified some steps. For instance, the rich to simple
only needs a Set, not a Map, and the case construct doesn't need to have
explicitly typed binders. Futhermore, the case result type does not
need to be stored in the case. I guess it is stored in GHC Core because
of GADTs, so if this is to be supported, maybe it will need to be
readded.
Add a representation of polymorphic first order logic
Simplify Simple and Rich representations, and move out Type separately
Look through type synonyms
Add a lint pass for the Rich language

Includes a fix for a discovered bug in remove default where the
introduced binders had incorrect type.
Add a run tests program
Fix a silly looping bug in rich to simple
Add more tests and don't error on silly scrutinee vars