[Bleeding] Handle players disconnecting during respawn. Fixes BUKKIT-4327

Prior to this commit, a player disconnected during a respawn event would
remain in memory. This causes a ghosting issue of players in the slot
count and player list, as well as a reference leak.

This commit avoids re-adding the player to the player list (and world) if
they are disconnected. This ensures that the remainder of the respawn
logic is completed as well as ensuring a duplicate player is not left on
the server.

This commit also saves the player's file at the end of the method if they
have been disconnected to ensure that their next login is accurate to the
respawn event's actions. A player that was revived and disconnected will
reconnect as revived.
Implement SpawnReason.NETHER_PORTAL and DISPENSE_EGG Fixes BUKKIT-3148

Previously any entities spawned through dispensers (monster eggs) or
by nether portals were given the incorrect SpawnReason of SPAWNER_EGG.
This made it impossible to distinguish what exactly happened in regards
to the creature being spawned.

This commit implements two new SpawnReasons: NETHER_PORTAL and
DISPENSE_EGG. The NETHER_PORTAL spawn reason is used for when the entity
being spawned by the nether portal itself. The DISPENSE_EGG reason is used
for when a dispsener "dispenses" a mob into the world.