TR: Implicit and mutually recursive type aliases, with support for class aliases

This pull request is a revival of an older PR that adds recursive type aliases.

The main differences between these two:
  * Now has support for `Class` types that use the `#:implements` clause in conjunction with mutually recursive references to other classes. (cyclic `#:implements` not allowed)
  * Updated contract generation that uses the new static contracts framework.

For feedback: a large chunk of this PR has already been code reviewed, so feedback mainly appreciated on new parts of the code.

This PR also includes type environment mappings for `racket/gui` and related libraries. It's not logically a part of the recursive aliases, but it may be useful for anyone who wants to try to see if it works (GUI types are mutually recursive).

@shekari Can you see if the static contract changes I'm adding look okay? Of the changes, commit c90d0731576287a401a8cc9c9866d27d62f5f2d4 is the largest change. I'm not sure it's still necessary, but it used to be that case that without it the zos were gigantic due to serialized contract code. (I'll test it out and remove the commit if it's not necessary)