Make tidy actually work
Extend region guarantor logic to handle autoref, which will
be necessary for reborrowing.
Remove bounds from type decl of smallintmap
Add to_str() definitions for some AST types
Do not try to encode/decode inference types, should not be necessary
Refactor to make inference code around unification more readable
rename assign to coerce, remove some bad copies
Rewrite the coercion code to be more readable, more sound, and to reborrow when
needed.

Regarding soundness: there was a subtle bug in how it was done before; see the
compile-fail test for an example.

Regarding reborrowing: reborrowing allows mut and const
slices/borrowed-pointers to be used with pure fns that expect immutable data.
remove hacks now that #3148 is fixed
remove unused variable
loan: Track whether or not the current path owns the data being
lent.  We can be more liberal with respect to the scope of the loan
if we do not own the data being lent, which used to be impossible
but can now occur with `&mut`.