Add a utility for principal types
WebAssembly has the property that every valid sequence of instructions has a principal type, i.e. a unique most-specific type. However, due to various kinds of polymorphism, these principal types may contain type variables. Specifically, the syntaxes for value types, heap types, nullability, sharedness, and exactness are all augmented with type variables.
Add a PrincipalType utility for representing and composing these principal types. This can be seen as a more powerful version of the existing StackSignature utility. Follow-up PRs will update ChildTyper to use principal types to represent type constraints and use the principal types of outlined instruction sequences to detect polymorphism and determine the types of outlined functions. There are also further potential applications in simplifying validation, simplifying expression typing, and performing spec-compliant validation.