This is a prerequisite for supporting skinning of leaderboards.
- New `IGameplayLeaderboardProvider` and `IGameplayLeaderboardScore`
interfaces are introduced. They are strictly concerned with supplying
leaderboard data.
- Logic of managing display, which was previously jammed into the
inheritance hierarchy of `GameplayLeaderboard`, is now moved into
`IGameplayLeaderboardProvider` implementations. Solo play,
multiplayer, and multiplayer spectator get their own implementation of
the interface.
- The inheritance hierarchy of `GameplayLeaderboard` and per-player
overriding of the implementation of the gameplay leaderboard is gone.
Only one drawable class (renamed to `DrawableGameplayLeaderboard`) is
allowed to display the leaderboards, across all modes of play.
The tests are only meant to ensure that gameplay eventually starts.
The case where failures can occur is where the master clock is behind
the player clock (due to being in lead-in time). Because the test is
running in real-time, it can take arbitrary amounts of time to catch up.
If it took too long, the test would fail.
Removing user triggers `playingUsers.Remove`, but doing so before
updating the state leads to `EndGameplay` being called with `State ==
Playing` rather than `Quit`.