Block Definitions - Custom Logic Per Block

This pull requests implements a new way to define blocks. With Block Definitions. This pull request also includes a few blocks that I've made.

Note: With this implementation at the moment blocks without definitions will create a default block definition. Default block definitions will have no break / place sound. When a default block definition is broken it will drop one of the block type it is part of.

The BlockType is more or less of a duplication of the enum in BlockId.

I fixed a duplication bug when implementing this. If people tried breaking blocks that were outside their reach it would just cancel the block place but it would still drop the item.

I do know some sounds are broken as I could not remember their names. I know at least the sounds are broken for leaves, saplings, and placing dirt.