Common Code Removal

Like it says.

Also adds Longest Common Substring algorithm. It's slower than Smith-Waterman and about as accurate as line comparison. In short it's a massive failure and I don't think it can be optimized much more.

I'm going to do more optimization work on Smith-Waterman, and tokens in general, to try and improve performance to make it more usable. SOON(TM).

The alternative is a *damn* lot worse - it requires reimplementing List equals(), Collection equals, and a few others.

Decorators to override equals with a contract-violating version are bad, but they do reduce code footprint and at least make our behavior obvious.