Clean up lexicons: add variant, remove challengerColor, enforce opponent
- Add variant field to both game and challenge lexicons/types
- Remove redundant challengerColor from challenge (color is already
determined by the game record white/black fields)
- Enforce opponent check on challenge acceptance so directed challenges
can only be accepted by the intended player
- Sync SPEC.md lexicon blocks with actual lexicon files (add lastMoveAt,
variant; fix resultReason values)