Tiger — fix type equality for NAME types

It need not be the case that both types are of type NAME. We must also
handle the case when one of them is a NAME, but the other is something
else. This is important when typechecking recursive data types.
Tiger — add support for recursive data types
Tiger — remove usage of SMLNJ pattern matching extension

Standard ML does not have support for multiple patterns in a
single case rule.
Tiger — support *mutually* recursive data types