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'm a bit confused by this line.  It is rescoring the nodes during the neighbor function call?  I guess that would work, but it's a bit tricky.  I wonder if we should have a function like: `CityNode.getCost = function(fromNode) { return GPSheuristic(fromNode, this) }`.  Then we could have `GridNode.getCost = function() { return this.type }`.

Then inside of the `search` function instead of accessing `neighbor.cost` we could do `neighbor.getCost(currentNode)`