App now receives an AppChannels struct; AppEvent enum removed.
Event handling, tick generation, and audio communication are now
performed through dedicated channels.
Introduce `AppEvent::Tick` and a background thread that emits timed
events. `App` now handles `Tick` by calling a new `update` method,
which advances the board and increments a `turn_counter` in
`SkirmishState`. Add required imports, fields, and the
`spawn_tick_thread` call in `main`.