Changed block.id from a float to a custom BlockID type

The float system caused lots of problems the custom type should hopefully address.

Commit descriptions have more detail.