Refactored BlockPlaceEvent logic to be more efficient. Fixes #465, #525

Previously all block placement for vanilla blocks were being routed
through CraftBukkit's processBlockPlace to handle cancelling the event
properly. This did not work well with forge mods as many overrided
ItemBlock.onItemUse method so we added logic to
World.canPlaceEntityOnSide. While this seemed to be effective for *most*
forge blocks, it was highly inefficient as every allowed block placement
went through 2 actual places: 1 for testing permissions, and another for
the actual place. This caused problems with quite a few blocks such as
MFR's DeepStorageUnit. So instead of trying to hardcode fixes for specific
blocks, I decided to rewrite the logic completely. Now all placement for
vanilla and forge will be handled in ItemStack.tryPlaceItemIntoWorld. The
benefit from doing this is:

1. No more simulated placements for forge block placement which should add a
boost to performance and prevent all future bugs related to placement.
2. All items that place blocks into the world should now be able to be
protected properly which includes FMP, Immibis Microblocks, Mystcraft's
writingdesk and much more.
3. Far less base edits which means less chance to cause bugs in future
updates and higher compatibility with Forge.

The new logic basically is handled in ItemStack.tryPlaceItemIntoWorld with
the following:

Before calling Item.onItemUse, a recording flag is turned on for
World.setData. This essentially allows us to record a blockstate for each
block that is sent through this method as Item.onItemUse is processed.
The reason behind this is certain Items such as ItemBed and Mystcraft's Writing Desk
place an extra block during placement so we need to make sure to capture
all block locations that change for restore. When a block placement event is cancelled,
the captured blockstates are processed and restored to the block that was captured
before the placement happened. Before ItemStack.tryPlaceItemIntoWorld is
finished, the captured blockstate list is cleared.

Thanks to immibis and ChickenBones for giving me ideas for the code
change.