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