Both type classes as well as family instances imply implicit
type constructors. These implicit type constructors refer to their parent
structure (ie, the class or family from which they derive) using a type of
the following form. We use TyConParent for both algebraic and synonym
types, but the variant ClassTyCon will only be used by algebraic TyCons.

Extract those DataCons that we are able to learn about. Note
that visibility in this sense does not correspond to visibility in
the context of any particular user program!

This is the making of an algebraic TyCon. Notably, you have to
pass in the generic (in the -XGenerics sense) information about the
type constructor - you can get hold of it easily (see Generics
module)

Foreign-imported (.NET) type constructors are represented
as primitive, but lifted, TyCons for now. They are lifted
because the Haskell type T representing the (foreign) .NET
type T is actually implemented (in ILX) as a thunkT

NB: when compiling Data.Tuple, the tycons won't reply True to
isTupleTyCon, becuase they are built as AlgTyCons. However they
get spat into the interface file as tuple tycons, so I don't think
it matters.

isDistinctTyCon is true of TyCons that are equal only to
themselves, even via coercions (except for unsafeCoerce).
This excludes newtypes, type functions, type synonyms.
It relates directly to the FC consistency story:
If the axioms are consistent,
and co : S tys ~ T tys, and S,T are distinct TyCons,
then S=T.
Cf Note [Pruning dead case alternatives] in Unify

If the given TyCon has a single data constructor, i.e. it is a data type with one
alternative, a tuple type or a newtype then that constructor is returned. If the TyCon
has more than one constructor, or represents a primitive or function type constructor then
Nothing is returned. In any other case, the function panics

Find the expansion of the type synonym represented by the given TyCon. The free variables of this
type will typically include those TyVars bound by the TyCon. Panics if the TyCon is not that of
a type synonym

Extracts the newtype coercion from such a TyCon, which can be used to construct something
with the newtypes type from its representation type (right hand side). If the supplied TyCon
is not a newtype, returns Nothing