Right now the shared Rust library implements most of the core state tracking for a mahjong match in the MatchState (soon to be LocalState) type. However, the C# code is currently handling the work of managing a last-known server state separate from a local state, including the work of tracking which actions have been been performed locally and reconciling incoming server actions with expected actions. This logic is fairly complicated and could be more easily tested as part of #12 if the full state management were in the Rust layer.