Mirror the A* path changes in Dijkstra

That means merging DijkstraPathWithCallback and DijkstraPathFromMap structs,
removing the lifetime param and implementing a `walk` method that returns an
iterator.