PointGraph (PointUndirectedGraph, PointDirectedGraph, PointTree)

This PR changes the way we define a `PointGraph`. The old `PointGraph` class (mainly used in landmarks) is now replaced by `PointUndirectedGraph`. There are also `PointDirectedGraph` and `PointTree`. This way of defining the `PointGraph` family classes is now consistent with the way the `Graph` family is defined (`UndirectedGraph`, `DirectedGraph`, `Tree`).

Finally, this PR adds a function that checks whether the `adjacency_array` provided in the `Tree` class actually represents a tree, otherwise an error is raised.
`:` or `...` indexing at the back (right side) of arrays is never required due to broadcasting - this is equivalent to
```python
return self.points[children] - self.points[parents]
```