Substantial refactor of algorithm running code for improved speed

The earlier, naive SimilarityMatrix "fill the entire matrix" approach
was abandoned in favor of generating all valid pairs of 2 submissions,
and running a given algorithm on these pairs. The similarity matrix is
then generated from the results of this.

This is an improvement from O(S^2) to O(S!) where S is the number of
submissions being analyzed.

Small speed optimizations were made to SmithWaterman and TwoDimIntArray
as well. SmithWaterman makes fewer calls to create coordinates, and
uses a new method in TwoDimIntArray for finding the max of
predecessors, which uses a more efficient algorithm and removes the need
for an expensive list creation.

Signed-off-by: Matthew Heon <matthew.heon@gmail.com>
Small fix to the similarity matrix printer. Reorder operations in ChecksimRunner.

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