Changed SpansInBuckets API to make it better optimizable

Instead of using .getHits() to get a list of Hit objects, use methods
.bucketSize(), .start(index) and .end(index) to iterate through the hits
in each bucket.
Optimized the way some queries are executed using new BLSpans base
class.

BLSpans is the base class for all our Spans classes now, and includes
extra methods that can give guarantuees about properties of the hits
in a BLSpans object (such as: "all hits are of the same length"). These
are used to skip certain steps or to follow faster code paths for some
cases.
Fixed NullPointerException when querying all tokens
Slight optimization to how Thread interrupts are checked for