Add GameMode enum and PlayerGameModeChangeEvent

Is there any specific reason we'd need to expose the ID? Seems like an ENUM is enough for outward use, the id would simply be an implementation concern.