Log games and box scores — sport-agnostic stat schema

Games are the unit of competition. Box scores are the per-athlete numbers.

To log a game:
1. Games tab → "+ Game" (or use the Schedule tab if it's already scheduled)
2. Opponent, date, location, home/away
3. Final score (when complete)
4. Per-athlete box-score entries — pick the athlete, fill the stats relevant to your sport

Stat schema:
- `BoxScoreEntry.stats` is `Record<string, number | string>` — sport-agnostic at the storage level
- Per-sport canonical key sets in src/lib/sports.ts `STAT_KEYS`:
- Baseball: AB H 2B 3B HR BB SO R RBI SB IP ER K
- Football: PA CMP PYDS PTD INT (etc.)
- Basketball, soccer, hockey, lacrosse all have their key sets
- Adding a new sport = declaring its key set; the storage shape doesn't change.

Once you mark a game **Final**:
- `onSportsGameFinalized` fans every box-score entry with a `linkedUserId` out to `users/{uid}/athleteStats/{seasonId}` and updates lifetime totals on the athlete's profile
- The fan-out is idempotent via the `sportsGameDelivery/{gameId}.athleteUids[]` ledger — re-marking final does not double-count
- The athlete sees the new stats in their /me/athlete dossier immediately