An immutable set of players. The sets are shared such that the same set of players is cached and re-used.
This reduces memory usage when a lot of player sets are created for the same set of players.

All standard methods for adding and removing return a new immutable player set with the changed contents.
To check whether contents were changed as a result of a call, simply check whether the returned instance
is the same as the one the method was called on.