feat(api): add WebSocket handlers and game state management
- handleLobbyJoin: validates DB membership and waiting status,
registers connection, tags ws.lobbyId, broadcasts lobby:state
- handleLobbyLeave: host leave deletes lobby, non-host leave
removes player and broadcasts updated state
- handleLobbyStart: validates host + connected players >= 2,
generates questions, initializes LobbyGameData, broadcasts
first game:question, starts 15s round timer
- handleGameAnswer: stores answer, resolves round when all
players answered or timer fires
- resolveRound: evaluates answers, updates scores, broadcasts
game:answer_result, advances to next question or ends game
- endGame: persists final scores via finishGame transaction,
determines winnerIds handling ties, broadcasts game:finished
- gameState.ts: shared lobbyGameStore singleton and timers Map
- LobbyGameData extended with code field to avoid mid-game
DB lookups by ID