Abstracted collision detection

This abstraction will remove the need for each model to have their own
collision detector, this improves performance drastically.