f6425d09

Add TestId, TestIdTrie, and per-test filtering (prerequisite for mutatie)

## Summary

- Adds \`Test.Syd.TestId\` with an opaque \`TestId\` type (description path + per-description sibling index), \`TestIdTrie\` for efficient subset filtering, and \`renderTestId\` / \`testIdFilterArg\` / \`parseTestIdFilterArg\` for human-readable output and \`--filter-id\` round-tripping.
- Adds \`flattenTestForestWithIds\` to enumerate all \`TestId\`s from a \`TestForest\`, assigning stable per-description sibling indices so duplicate descriptions are uniquely identified.
- Adds \`filterTestForestByTrie\` to filter a \`TestForest\` to exactly the tests in a \`TestIdTrie\`; wrapper nodes (\`beforeAll\`, \`aroundAll\`, etc.) are kept when any child matches and dropped when all children are pruned.
- Adds \`execTestDefM'\` to evaluate a \`Spec\` once and return both the \`TestForest\` and a full-coverage \`TestIdTrie\`, so the spec need not be re-evaluated in a mutation loop.
- Adds \`getTestIds\` and \`runFilteredForest\` as the public API for enumerating test IDs and running a pre-built forest filtered to a given trie.
- Adds \`--filter-id\` CLI flag and \`settingFilterIds\` field to \`Settings\` for exact single-test selection by \`TestId\`, composing with the existing \`--filter\`.

All existing tests pass. Golden files updated for the new \`settingFilterIds\` field in \`defaultSettings\` and the new \`--filter-id\` flag in the CLI documentation.

## Test plan

- [ ] \`nix flake check\` passes (verified locally)
- [ ] \`stack test sydtest-test\` passes (133 passed, 0 failed)
- [ ] Pre-commit hooks all pass (ormolu, hlint, hpack, cabal2nix)

Suite timing

Time to Start Worker time Duration Time to finish
Config 2s 2s 2s 4s
Eval 6s 44s 44s 50s
Build 4m54s 11m06s 6m04s 10m59s
Test - - - -
Deploy - - - -
Suite 2s 11m52s 10m57s 10m59s

Timeline

0s5m6m7m8m9m10m