Parent: Issue #98
Implement zone ownership and visibility. Zones have owners; cards have two visibility axes.
- computeViewState(state, viewerSeat | 'omniscient') → MaskedState
- Axes: faceVisibility (all|owner|others|none), presence (visible|hidden-from-non-owners)
- Card masking: non-owners see blanks, hidden piles disappear
- Solo features: seat switcher, omniscient mode
- No per-card overrides; reveal = move to visible zone
Acceptance criteria
Blocked by: None
Parent: Issue #98
Implement zone ownership and visibility. Zones have owners; cards have two visibility axes.
Acceptance criteria
Blocked by: None