use a tuple to key the ChunkLoader hashtable

Removes the need for Vec3 to implement IterBytes.
replace vertex shader branches with dot products
move Mesh to its own file
terrain: make blocks array private
preload chunks before main loop
terrain: use get_mut to modify blocks
terrain: store neighboring blocks

This allows the meshing algorithm to cull unnecessary faces on the side of the
chunk.
mesh: bounds-check run_length
terrain: generate all neighbor blocks
mesh: remove block_exists
terrain: remove Option wrapper around get result
generate multiple chunks in the Y axis
move FBO struct to its own file
replace requested chunks every frame

Fixes a problem where the chunk loader couldn't keep up with a fast camera.
cull chunks outside of a VISIBLE_RADIUS circle
add shift keybinding to speed up camera movement
load chunks in a separate thread

Uploading data to the GPU is still done on the main thread.
spread chunk loading across multiple worker threads
add use for older rustc