Add bbox refactor

This simplifies bbox construction: the constructor always checks if the bbox is valid, and will not allow invalid bboxes to be constructed. Intersection methods should take arguments in the same order as the constructor, and methods off of the bbox should not silently fail with null.