Expands all type synonyms in the given type. Type families currently won't be expanded (but will be passed through).
Make a list of names (based on the first arg) such that every name in the result is distinct from every name in the second arg, and from the other results
Make a name (based on the first arg) that's distinct from every name in the second arg
Example why this is necessary:
type E x = forall y. Either x y ... expandSyns [t| forall y. y -> E y |]
The example as given may actually work correctly without any special capture-avoidance depending
on how GHC handles the
ys, but in any case, the input type to expandSyns may be an explicit
mkName to ensure a collision.