Reify seats

Distinguish between the seat with the cards, and the "player" (bot or
human) that is choosing which cards to play.
Prefer interface for UI abstraction
Migrate to core.async channels