// NominalType -- a non-generic struct, enum or class
// ProtocolType -- a type of some value conforming to a protocol, whose concrete type is only known at run time
// ProtocolCompositionType -- a type of some value conforming to zero or more protocols
// BoundGenericType -- a generic struct, enum or class
// TupleType -- a product of zero or more types
// FunctionType -- a function value with an input and result type, and possibly some attributes
// MetatypeType -- the type of a type
// ExistentialMetatypeType -- the type of all types conforming to a protocol