Add a generalized A* algorithm (doesn't assume 2D grid, only a Graph
with Nodes)

The original 2D algorithm is moved to a separate file and renamed to
AStar2D. Two benchmarks are created: one of them tries to recreate the
2D benchmark using the generic algorithm (for performance comparison).

Bonus: basic unit tests, general code dartification, classes, generics,
use of mixin architecture, updated README, and much more!