Added variances to type, dirt, and region parameters.
Unify now takes variance of its type parameters into account.
Added constraints. Does compile, but does not work.

Each type scheme is equipped with a list of constraints (inequalities between types,  dirts, or regions).
Unify.solve now returns the remaining constraints in addition to the substitution it managed to perform.
Constraints can be substituted, refreshed, and similar, but there is a bug when you perform a substitution on a context.
Quashed the bug, but everything is extremely slow.

It takes about half a minute to load the pervasives.
The main reason is that we never clean up any constraints we get.
What surprises me is that everything is slow, even typing a variable straight from the context.
Unify generates constraints for all arguments.
Unify expands inequalities between type parameters and types.

Whenever we see an inequality between a type parameter and a type, we replace the parameter with a fresh type of the same structure, and compare the two instead.
Inference for let returns a list of dirts.

We will at some point want a list in order to see which computations may be parallelized.
Minor change of handling of dirts in TopLet.
Unification is faster and produces only "atomic" constraints.

Removing duplicate constraints helped performance.
Merge branch 'master' of github.com:andrejbauer/eff
Added fresh instances do dirty types.

Now, we must make sure that such fresh instances are appropriately refreshed.
Added top region and substitutions of instances.
Added substitution of fresh instances in constraints.
Tracked down a bug in subst_inst_dirty. Hacked up fresh instance freshness.
Unify is not recursive anymore, it just adds constraints to the queue
Unify builds a graph of primitive constraints. However there is a bug.

assert in Ctx.subst_ctx fails because somewhere along the line we
screwed up something. The most likely culprit is add_substitution
in unify.ml.
Debugging graphs
Small improvement to comments
Fixed a bug that kept accumulating constraints.
Fixed a bug that kept generating substitutions of non-parameter dirts and regions.