Adjust the ObjC protocol conformance workaround to be more extensible.
Use a synthetic type for the protocol (struct Protocol). Embed this
within a reserved namespace to permit extending the extended pointer
type qualifiers similarly for ObjC lifetime qualifiers.
Introduce additional special handling for __autoreleasing, __strong,
and __weak Objective C lifetime qualifiers. We decorate these by
creating an artificial template type Autoreleasing, Strong, or
Weak in the __ObjC namespace. These are only considered in the
template type specialization and not the function parameter.