Add GameMode enum and PlayerGameModeChangeEvent

Event payload should not be changed by it's listeners. No other events have set* methods