Major optimizations to Smith-Waterman algorithm. Major bugfix in TokenListCloner

TokenListCloner, when it was refactored for Java 8, lost the ability to retain
the validity of a token across a clone, which caused nontermination of the
Smith-Waterman algorithm in any case with two matches of more than 5 tokens.

The Smith-Waterman algorithm and associated TwoDimIntArray have been
substantially refactored to optimize speed. The core loop of Smith-Waterman,
in particular, was profiled and optimized extensively (in particular, removing
redundant calls and replacing the sorting algorithm for predecessors).

On my system, 45 submissions of 600 tokens average are processed in 1m4s. This
should be more than fast enough for typical use.

Signed-off-by: Matthew Heon <matthew.heon@gmail.com>