Use synchronous calls and wait for chat disconnect. Fixes BUKKIT-2946

When invalid chat is detected we currently drop the connection with no
hint as to why as anything else is not allowed while we're off the main
thread. To give valid disconnect reasons and fire proper events instead
pass these off to the main thread and wait for it to process them.
Ignore empty custom payload packets. Fixes BUKKIT-2957
Don't create tile entity when block placement fails. Fixes BUKKIT-2924

End portals can only be placed in the end during the dragon's death.
Attempts to place them outside of this window causes the block to remove
itself. However, we still create the tile entity for the portal which
leads to exceptions spamming the console about a tile entity existing
without the appropriate block. In these cases we should not place the tile
entity at all.
Don't wait for main thread when processing commands.

In order to correctly handle disconnects for invalid chat we setup a
Waitable and pass it to the main thread then wait for it to be processed.
However, commands are also chat packets and they are already on the main
thread. In this case, waiting will deadlock the server so we should just
do a normal disconnect.
Fire BlockFadeEvent when soil turns back to dirt. Fixes BUKKIT-1854
Add BlockVine.java from mc-dev for diff visibility.
Fire BlockSpreadEvent for vine growth. Fixes BUKKIT-1097
Implement API for Skeleton and Zombie types. Fixes BUKKIT-2818
Don't kick player when they travel too far. Fixes BUKKIT-2968

If a player travels past 32,000,000 blocks on the X or Z coordinates they
will be kicked for having an illegal position. On kick their player data
is saved which includes their (illegal) position. This means on join they
are immediately kicked again for the same reason and are stuck. Instead of
kicking at all in this case just teleport the player back to their previous
position just like the moved wrongly check does.
Don't show a player on map if they're vanished. Fixes BUKKIT-1882
[Bleeding] Use case from player data for OfflinePlayer. Fixes BUKKIT-519

If a plugin looks up a player that is offline they may not know the correct
capitalization for the name. In this case they're likely to get it wrong
and since we cache the result even after the player joins the server all
future request for an OfflinePlayer will return one with incorrect case.

When looking up a player who has played on the server before we can
get the correct case from the player data file saved by the server. If
the player has never played before this point we cannot do anything and
will still have the same issue but this is not a solvable problem.
Use correct itemstack for dispenser behavior chaining. Fixes BUKKIT-2886

When an event changes the item to be dispensed we check to see if the new
item has special behavior for dispensing and if so pass it on to that
behavior handler. However, we are actually checking the old itemstack and
passing the new itemstack so this check fails.
Implement sound changes for Minecraft 1.4.2 changes. Fixes BUKKIT-2849
Lower compression level to avoid overloading the thread. Fixes BUKKIT-2963

When sending chunks to a player we use their writer thread to do chunk
compression to avoid blocking the main thread with this work. However,
after a teleport or respawn there are a large number of chunk packets to
process. This causes the thread to spend a long period handling compression
while we continue dumping more chunk packets on it to handle. The result of
this is a noticable delay in getting responses to commands and chat
immediately after teleporting.

Switching to a lower compression level reduces this load and makes our
behavior more like vanilla. We do, however, still give this thread more
work to do so there will likely still be some delay when comparing to
vanilla. The only way to avoid this would be to put chunk compression back
on the main thread and give everyone on the server a poorer experience
instead.
Don't do case lookups when we have the right case already.

This is a missed part of the original "[Bleeding] Use case from player data
for OfflinePlayer. Fixes BUKKIT-519" commit. It avoids doing (somewhat
expensive) lookups of player data to find the correct capitalization inside
getOfflinePlayers() as we're already loading their name from the player data
and thus have the correct capitalization.
Fix missed rename making withers too cheaty. Fixes BUKKIT-2972
Fix players losing experience when keepInventory is true. Fixes BUKKIT-2915
Don't add player to world if join event did it already.

On join we unconditionally add the player to the world they logged out in.
If a plugin teleports a player during PlayerJoinEvent in a way that adds
them to a world (cross-world teleport) we end up with one player in two
places. To avoid this we check to see if the player has changed worlds or
is already added to the world we have we skip adding them again.
Updated version to 1.4.5-R0.1 in pom.xml for Beta.
Updated version to 1.4.5-R0.2-SNAPSHOT for development towards next release.