Changing 'PlayerService' to block the calling thread until data is available

The current MumbleLink implementation does not wait for data to become available, and there is a possibility that data is unavailable even though the game is running.

Specifically, the following conditions have to be met:
* A memory-mapped file named `"MumbleLink"` has to exist
    * (never created by the game client, although closing the game client also seems to close the file)
* The game client must have _ticked_
    * (happens approximately every 33 milliseconds)

In practice, that means that there's a race condition: the memory-mapped file may be empty for up to 33 milliseconds after its creation. When that happens, a `null` reference is returned by `MumbleLinkFile.Read()`.

This behavior causes null pointer exceptions later on, so I'm adding a method `ReadBlocking()` to the `PlayerService` class that never returns `null`. Instead, it blocks the calling thread until data is available.