Generalized A*

Hi Seth, your A* port is very handy for me right now, but I needed a generalized version (not just 2d tile maze). It was easy to do. I moved your 2D code to its own file so the two don't interfere (because: if you need a 2d maze A*, you probably don't need a generic A*, and vice versa).

I was able to run your benchmark and web app through my code by modifying the Maze and Tile classes (implementing the Node interface, essentially). It ran okay, but it was much slower (understandably – i.e. hopefully not because of a bug in my code). I hope I'll add the 2D-to-generic code later, but not before I figure out how to make it elegantly (i.e. without touching your code).