Type synonym declarations
These permit the user to introduce a new name for an already existing
type, e.g.
string == [char]
type synonyms are entirely transparent to the typechecker (it best to
think of them as being just macros). For obvious reasons, recursive type
synonyms are not permitted.
It is also possible to introduce a synonym for a type forming operator,
by introducing generic type variable as parameters of the definition,
e.g.
invt * ** == (*->**)->(**->*)
So within a script containing the above two `==' definitions, the type
`invt num string' will be shorthand for
(num->[char])->([char]->num)