Parallelise

I parallelised playing matches using PLINQ (after a bit of refactoring).

The iterator pattern, combined with a BlockingCollection used as a message queue, prevents any player from playing more than one match simultaneously

* this will prevent players from having concurrency issues
* unfortunately, it also means that some players will be idle while waiting for an opponent