Global alignment (Needleman-Wunsch) with a k-band heuristic.

Only cells with |i - j| <= k are evaluated, which turns the O(l1l2) dynamic programming into O(l1min(l2, 2k)) time.

The implementation keeps two rolling row buffers instead of the full score matrix, so that the working set is O(k) rather than O(l1*l2).