Replace TypeSet with Type Specifications

These are capable of representing infinite sets of types,
provide better clarity and simplicity in the type checking,
and resolves a number of inconsistencies that could occur.