2858adeb

Add in-process mutation testing infrastructure

## Summary

- Adds three new packages: `sydtest-mutation-runtime`, `sydtest-mutation-plugin`, `sydtest-mutation-example`
- Adds a GHC plugin (`Test.Syd.Mutation.Plugin`) that instruments source code at typecheck time, wrapping mutation candidates with `ifMutation` calls
- Adds `--mutation DIR` flag to sydtest (repeatable); when set, runs the test suite once per mutation in the manifest directory, in-process, reporting killed/survived counts
- Manifest format: per-module JSON files (`<dir>/<ModuleName>.json`), one per instrumented module, each an array of `{id, operator, original, replacement}` records
- Adds Nix helpers (`addManifest`, `compileMutationReport`, `assertMutationScore`) for building mutation checks as Nix derivations
- Adds e2e CI checks for `really-safe-money` and `safe-coloured-text` (the latter demonstrates multi-library instrumentation with golden test resource support)
- Adds `mutation-testing-architecture.md` documenting the design

## Key design decisions

- **In-process**: the test suite binary contains all mutations; `ifMutation` selects which one is active via an IORef — no recompilation per mutation
- **Per-module JSON manifests**: each instrumented module writes its own file; sydtest reads one or more manifest directories via repeated `--mutation` flags
- **`sydtest-mutation-runtime`** is the shared leaf package depended on by both the plugin and sydtest, keeping the GHC API out of sydtest itself

## Test plan

- [ ] `nix flake check` passes (CI runs `mutation-really-safe-money` and `mutation-safe-coloured-text` end-to-end checks)
- [ ] Check that `--mutation` flag appears correctly in `--help` output
- [ ] Review `sydtest-mutation-example` to confirm the plugin instruments as expected

Suite timing

Time to Start Worker time Duration Time to finish
Config 0s 2s 2s 2s
Eval 2s 41s 41s 44s
Build 6s 33s 19s 25s
Test - - - -
Deploy - - - -
Suite 0s 1m17s 44s 44s

Timeline

0s0s10s20s30s40s