Compare constructor representations in interfaces and coercions alike
Why
An interface or a coercion accepted a tagged constructor for an @unboxed one: inclusion compared only the tags of tagged constructors, and the coercion check only the declared @as (#9038). The coercion error also said that the wrong variant was unboxed.
Variant_runtime.same_representation compares two constructors: constant with the same literal, tagged with the same tag, or both untagged. Interface inclusion and the coercion check use it. Type declarations in messages print the @unboxed of an untagged constructor of a type that is not @unboxed itself, and an interface mismatch names the constructor that is @unboxed in only one declaration. The predefined unknown, an @unboxed variant, now has the untagged layout a declaration of it gets, so @unboxed type rec t = unknown = Unknown(_): t still agrees with it.
addedDiagnostic interface with an @unboxed constructor
module M: { type t = | @unboxed A(int) | B({x: int})} = { type t = | A(int) | B({x: int})}
diagnostic
addedDiagnostic coercion between representations
type a = | @unboxed A(int) | B({x: int})type b = | A(int) | B({x: int}) | Clet x: b = (A(3): a :> b)
diagnostic
modifiedDiagnostic unboxed configurations
@unboxed type x = One(bool) | Twotype y = One(bool) | Two
diagnostic
Fixes #9038