Renamed BBox.pmin to BBox.p_min (same for pMax/p_max)
Added BBox.intersect_p() method
Added missing docstring
Added unit test for BBox.intersect_p()
Changed test to use Transform.is_identity()
Returns float('inf') when no intersection found
New classes: Primitive, GeometricPrimitive, TransformedPrimitive, Aggregate