remove higher rank constraints
Fix for issue #49

Typechecking has been enhanced in many places to deal properly with
higher rank polymorphic functions with constraints.

In code generation, we now treat lambda and pattern arguments of
higher ranked functions as uninstantiated with regard to constraints.

This means that every expression that gets passed for such functions
will be wrapped in a lambda that accepts the needed constraints,
except if it is itself a lmbda bound function of the same type.

When such a function is actually applied, the current constraints are appled first
before the arguments.