Use NNFI scheduler algorithm

Update the scheduler algorithm to NNFI -- Nearest Non-Failing Item.

A stateless description of the algorithm is that jobs for every
item should always be run based on the repository state(s) set by
the nearest non-failing item ahead of it in its change queue.

This means that should an item fail (for any reason -- failure to
merge, a merge conflict, or job failure) changes after it will
have their builds canceled and restarted with the assumption that
the failed change will not merge but the nearest non-failing
change ahead will merge.

This should mean that dependent queues will always be running
jobs and no longer need to wait for a failing change to merge or
not merge before restarting jobs.

This removes the dequeue-on-conflict behavior because there is
now no cost to keeping an item that can not merge in the queue.
The documentation and associated test for this are removed.

This also removes the concept of severed heads because a failing
change at the head will not prevent other changes from proceeding
with their tests.  If the jobs for the change at the head run
longer than following changes, it could still impact them while
it completes, but the reduction in code complexity is worth this
minor de-optimization.

The debugging representation of QueueItem is changed to make it
more useful.

Change-Id: I0d2d416fb0dd88647490ec06ed69deae71d39374
7 files changed