I'm not quite sure how mesh.domains().facet_domains() worked earlier, but the same data can be accessed from mesh.domains() and a mesh function can be created:
facet_domains = MeshFunction("size_t", mesh, D-1, mesh.domains())
The intersection code has been completely refurbished, and now use the class BoundingBoxTree:
mesh = UnitCubeMesh(4,4,4)
bbtree = BoundingBoxTree()
bbtree.build(mesh)
bbtree.compute_closest_entity(Point(2.0,0.0,0.0))