Make Tiles responsible for their own dragging

Rather than the TileRack checking if they're under the mouse and then
telling them to start dragging, just tell the Tile they should respond
to a mouse_down event.
When a Tile is dropped remove it from the TileRack
Listen for mouse_up events directly from Tile

When the Tile is being dragged it wants to know about mouse_up events.
When it's not being dragged, it doesn't care. This approach is cleaner
than having TileRack listen for events and telling all of its tiles
about it.
Emit a tile_drag event instead of calling @droppable.snap
Make Grid responsible for moving Tile

Emit a snap_tile event when it's done so TileRack knows to let go of
the Tile.
Remove unused Draggable#draggable?
Clean up requires
Handle snapping after tile_drop in Cell instead of Grid