Cosets are right cosets of elements in the normaliser.
We let cosets coerce to GroupSet.sort, so they inherit the group subset
base group structure. Later we will define a proper group structure on
cosets, which will then hide the inherited structure once coset_of unifies
with FinGroup.sort; the coercion to GroupSet.sort will no longer be used.
Note that for Hx Hy : coset_of H, Hx * Hy : {set gT} can mean either
set_of_coset (mulg Hx Hy) OR mulg (set_of_coset Hx) (set_of_coset Hy).
However, since the two terms are actually convertible, we can live with
this ambiguity.
We take great care that neither the type coset_of H, nor its Canonical
finGroupType structure, nor the coset H morphism depend on the actual
group structure of H. Otherwise, rewriting would be extremely awkward
because all our equalities are stated at the set level.
The trick we use is to interpret coset_of A, when A is any set, as the
type of cosets of the group A generated by A, in the group A <*> N(A)
generated by A and its normaliser. This coincides with the type of
bilateral cosets of A when A is a group. We restrict the domain of coset A
to 'N(A), so that we get almost all the same conversion equalities as if
we had forced A to be a group in the first place; the only exception, that
1 : coset_of A : {set gT} = A rather than A, can be handled by genGid.

Specializing all the morphisms lemmas that have different assumptions
(e.g., because 'ker (coset H) = H), or conclusions (e.g., because we use
A / H rather than coset H @* A). We may want to reevaluate later, and
eliminate variants that aren't used .