Allow AsynchronousExecutor.getSkipQueue() to pull tasks from the queue
Load all already generated chunks via async chunk system

Currently we use the async chunk loading system only when players trigger
chunk loading. If a chunk is loaded for any other reason it goes through
a separate codepath. This means if a player has trigged a chunk load and
before the chunk loads something else wants the same chunk we will load it
twice and throw away the second result. With this change we instead use
the sync processing feature of the AsynchronousExecutor to load the chunk
which will pull it out of the queue if it was already queued to load. This
means we only ever load a chunk once. Because chunk generation is not
thread safe we still fallback to the vanilla chunk loading system if the
chunk does not currently exist.
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 slow memory 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 re-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.