LoglessPairHMM arrays implementation

Instead of using [readbases]x[haplotypebases] matrices to store interim
values for the insert, delete, and match HMM states, we perform the same
dynamic programming using three generations of 1-dimensional arrays.

The order in which read/haplotype base intersections are encountered is
changed. We proceed as if passing over the diagonals of a read x haplotype
matrix.

This way, values in the arrays do not depend on each other, only on the
previous array generations. Updates are thus amenable to parallelization.

Currently no haplotype caching is performed.

Passes the smallTest and the mediumTest
Added haplotype caching to array implementation

Implemented caching when two successive haplotypes share a common prefix. By storing the partial sum and deletion array intermediate values at the first
differing haplotype base, we do not have to calculate the prefix bases
when running the subsequent haplotype.

This is most efficient when haplotypes are ordered such that shared
prefixes proceed from smallest to largest.

Moved array declarations from subcompute to PairHMM. Set arrays at a
constant maximum size. Now overwriting each time instead of reallocating.

Changed evaluate to pre-fetch the haplotype difference against the NEXT
haplotype as well as the last one.

Changed the array-fill loop to be based on dynamically set start/end
values. Frequently the hapStartIndex will be less than (readbases.length)
from the end of the haplotype. This causes the shape of the array stack to
change. The new way is robust when read-length < haplotype-length.

Passes the smallTest.