This adds a unification optimizations API, and uses it to optimize the embedded provisioner. With these turned on, type unification drops from around 1m45s to 2.5s which is a 40x speedup.
This adds some plumbing to pass values into the lang struct.
This will make it easier to add new solvers and also cleans up some pending issues.