b5336058

By: Tom Sydney Kerckhove <syd@cs-syd.eu>

Group mutation alternatives and skip remaining on first failure

When a mutation operator emits multiple alternatives at one source
location (e.g. ListLit's drop-each variants on a 3-element list), all
alternatives were previously tested independently.  Now they are
grouped: as soon as one alternative in a group fails (survives or is
uncovered), the remaining alternatives are recorded as 'Skipped'
without being run.

The plugin's writer monad now accumulates [MutationGroup] (one group
per applyAlts call).  MutationManifest and AugmentedManifest carry
list-of-groups; MutationRunReport replaces its flat survived/timed-out/
uncovered arrays with a single 'groups' field of [MutationGroupReport],
each carrying a list of MutationOutcome (Killed/Survived/TimedOut/
Uncovered/Skipped).  Timeouts do not trigger within-group skipping.
The within-group skip is independent of --mutation-fail-fast, which
still controls whether the whole run aborts.