Ability to have non-grid layouts

Hello,

Check out my commit and tell me what you think.

Your A* is great but was limited to a grid layout. I've added the ability to handle other layouts, such as a graph of cities.

- Extract grid specifities into the Graph function
- Extract heurstics functions into a specific object
- Update tests, benchmark & demo
- Added a specific test to demonstrate usage and gps heuristic
I may not have been clear enough here - I'm fine with reusing the heuristic for computing cost, but it's just confusing that it is a side effect of calling neighbors() in the middle of the search.  What I would suggest is that the CityNode and GridNode types both have a function called getCost that returns whatever is appropriate in each case.  Then instead of setting the cost inside of the neighbors function you could return the cost from this function call.