This trait is implemented by any type that can serve as a type
variable. We call such variables unification keys. For example,
this trait is implemented by IntVid, which represents integral
variables.
Trait implemented for values associated with a unification
key. This trait defines how to merge the values from two keys that
are unioned together. This merging can be fallible. If you attempt
to union two keys whose values cannot be merged, then the error is
propagated up and the two keys are not unioned.
Grows the stack on demand to prevent stack overflow. Call this in strategic locations
to “break up” recursive calls. E.g. almost any call to visit_expr or equivalent can benefit
from this.