Add one-to-one, one-to-many, many-to-one and many-to-many Dijkstra searches

Being able to stop a Dijkstra search once a given node or a given set of nodes has been found is a big advantage in terms of saving time (one-to-one, one-to-many).

It is also interesting to be able to calculate distance tables from an arbitrary set of nodes to another arbitrary set of nodes. These methods add that functionality, returning
* one-to-one: `double` (distance from source to target)
* one-to-many: `Map<V, Double>` (distance from source keyed by target)
* many-to-one: `Map<V, Double>`  (distance to target keyed by source)
* many-to-many: `Map<V, Map<V, Double>>` (distance from source to target, keyed first by source, then by target)