Added BlockEvent.PlaceEvent which fires before placing a block.

Before calling "ItemStack.tryPlaceItemInWorld", a recording flag is turned on for
setBlock to capture a blocksnapshot for each block that attempts to be
placed.

If 1 block is captured, a "BlockEvent.PlaceEvent" is fired to notify mods.
If 2 or more blocks are captured, a "BlockEvent.PlaceEvent" is fired first
with the first block captured followed by a "BlockEvent.MultiPlaceEvent"
with all captured blocks. This extra event is required for items that have
the ability to place 2 or more blocks such as a BlockBed.

If either event is cancelled, the recorded block snapshot(s), item stacksize, and item meta will
revert back to the captured snapshot(s).
If the events are not cancelled, a notification will be sent to clients and block physics
will be updated.

This commit also includes a new utility class called BlockSnapshot. This
new class is used in conjunction with PlaceEvent in order to record a
snapshot of block space before it is altered. This allows us to restore
the block(s) if an event is cancelled. The class also provides the ability
to restore a snapshot to any location using the restoreToLocation method.
This should be helpful to many mods that are looking to be able to capture
block data then restore it to back to any location required.