Deadlock Detection

When the two trains are stopped and unable to pass
one another we detect this and reroute one of the trains.

NOTE: This hasn't been fully tested as we usually fail
somewhere else before this case happens, but the foundation
is here.
Fix Demo to Not Choose Same Destinations

This fixes the demo code so it doesn't send the trains
to two destinations that are close enough, that
both can't reach their destinations.
Few More Bug Fixes

Fixed:
  1) dijkstra unit test were broken
  2) If the train is on a node and is very close to a branch
     it now gets directions from the node past the branch
     to avoid cases where our error puts us on top of
     the branch and we switch a switch we're on top of.
  3) Reverse error buffer is more conservative now, since
     overshooting is bad with 2 trains.
  4) No longer error when the first node in a path is a branch
     since it is possible (when we're on a branch node and the
     next node is a branch node).
  5) Don't try and reacquire a node we're blocked on since it
     results in unneccessary requests to the reservation server
     and overflows its buffers.
Stop Ignoring Sensor Updates when Stopping

So this caused issues when the train gets stuck. Since
we can travel quite far while stopping (i.e. on reverses) the
location becomes very inaccurate when the trian gets stuck while
reversing.

Instead, I just stopped resetting um_past_node when we hit a
sensor if we are stopping. I measured the results and they
were just as good.
BUG FIX: Missing Case in Edge Groups

In the reservation server we associate a "group" of
edges for each edge that we reserve/free at the same
time.

There was a missing case where an edge could be part of
two branch nodes.

Also added names to track_edge_arrays so that we know
which one failed when an assert fails.