16456eb1

Add RemoveCase and RemoveAction mutation operators

## Summary

- **RemoveCase**: For a `case x of { A -> a; B -> b; C -> c }`, generates every version with one arm removed (n mutations for an n-arm case, only fires when n ≥ 2). The desugarer validator filters out any removal that produces a type error.
- **RemoveAction**: For a `do { a; x <- b; c x; d }`, generates every version with one `BodyStmt` (no-`<-` action) removed. `BindStmt`, `LetStmt`, and `LastStmt` are left alone to avoid invalidating downstream variable uses or breaking the do-block structure.
- Added example source files (`CaseLib.hs`, `DoLib.hs`) and a test (`CaseLibSpec.hs`) demonstrating the new operators.

## Things to check

### Code review
- `RemoveCase`: The operator matches `HsCase x scrut (MG mgx (L lann alts))` and drops each alt in turn. Worth confirming the `MatchGroupTc` extension field (`mgx`) can be safely reused for each sub-match-group (it carries the result type and origin, which don't change when we remove an arm).
- `RemoveAction`: `isRemovableStmt` only matches `BodyStmt {}` — confirming that `LastStmt` is a distinct constructor and never a `BodyStmt` is important for correctness. Checked against GHC source: confirmed.
- The `XDo GhcTc = Type` field (`x`) is passed through unchanged when rebuilding the `HsDo` node — this is the monadic type of the do block, which is unaffected by removing an action.

### Try out locally
- Run the mutation example test suite to see the new operators fire: `stack test sydtest-mutation-example-gen --pedantic`
- Inspect the generated manifest to see `RemoveCase` and `RemoveAction` mutations appear: build with the plugin and look at the `.mutation-manifest` output.
- Try a case expression with 2 arms — should produce exactly 2 mutations.
- Try a do-block with only `BindStmt`s and a `LastStmt` (no `BodyStmt`) — `RemoveAction` should produce no mutations.

## Remaining questions / suggestions

- Should `RemoveCase` also fire on `LambdaCase`? At GhcTc, a `\case` desugars to `HsLam _ _ (MG ...)` rather than `HsCase`, so the current operator does not cover it. Could be a follow-up.
- The description strings ("removed #1", "removed #2") are opaque without context. A future improvement could include the pattern text of the removed arm (needs reading source lines).

Suite timing

Time to Start Worker time Duration Time to finish
Config 1s 2s 2s 3s
Eval 3s 44s 44s 48s
Build 1m05s 1h00m22s 51m44s 52m49s
Test - - - -
Deploy - - - -
Suite 1s 1h01m09s 52m48s 52m49s

Timeline

0s2m3m4m5m6m7m8m9m10m11m12m13m14m15m16m17m18m19m20m21m22m23m24m25m26m27m28m29m30m31m32m33m34m35m36m37m38m39m40m41m42m43m44m45m46m47m48m49m50m51m52m