Implement encoding for higher-kinded variables.

Now it is possible to write types as: ANY1 -> ANY ANY1

Types with constraints can be written as:
Dict (Monad ANY) -> ANY1 -> ANY ANY1

reifyConstraints can be used to produce the Dict argument:
reifyConstraints return :: Dict (Monad m) -> a -> m a

And the type representation of the polymorphic type can be obtained
as usual:

typeOf (reifyConstraints return :: Dict (Monad ANY) -> ANY1 -> ANY ANY1)