Ludo Controller
class LudoController(scope: CoroutineScope, link: LudoLink, fx: (Sfx) -> Unit, onDuelWon: () -> Unit, onGameOver: (won: Boolean) -> Unit, random: Random = Random.Default)
Runs a Ludo table on this phone.
Host (local play or LAN host): owns the LudoState, applies every action through Ludo.apply, drives CPU seats, and broadcasts each new state to guests.
Guest (LAN): mirrors the host's state and sends intents; the host decides what's legal.