The GenericSignatureBuilder is no longer used for anything by default, and we
don't want to create instances of it directly.
Instead, use the buildGenericSignature() utility method, which is backed by
the Requirement Machine.
The basic concept here was previously laid out in the metadata
system commits adding ExtendedExistentialTypeShape, but to recap,
we want to produce (for any existential type, but we're really
only going to use it for constrained or otherwise generalized
existentials) a "shape" signature and type that will be agreed
upon by all possible abstractions of the type. In this
signature+type pair, any substitutable position in the original
type is abstracted as a parameter in the signature, which the
original type is a concrete application of. This permits
agreement on the type in the face of runtime generic execution.
I have made every effort to support protocol compositions in
the code I've written, but of course until you're allowed to
actually write them, that's all untested.
I have not yet implemented signature minimization of the
generalization signature. I think this will be necessary in order
to ensure that there are no non-redundant parameters, especially
for compositions, which is something the runtime currently assumes
and is better for code size anyway. But it can wait a few days,
I think.