close
Tears down the game and the room it owns: stops the consensus node and closes the game channel view (GameSession.close), then leaves the backing Room.
A bare GameSession.close would close only the game's channel view — a no-op, since the Room owns the channel's lifecycle — leaking the room, its liveness detectors, and the underlying fabric. Because gameOverRoom takes ownership of the room, this override is the single teardown path; the caller must not call Room.leave directly.
Idempotent: a second call is safe — Room.leave latches on the room's closed flag.