Introduce a class for calculating Damerau-Levenshtein edit distances and strings

Summary:
This helps us attack three problems:

  - We currently can't give string transpositions a cost when evaluating British spellings for `arc`, so "alnd" has equal edit distances to "amend" and "land".
  - The intraline differ isn't UTF-8 aware, and the algorithm is character oriented.
  - ArcanistDiffUtils::buildLevenshteinDifferenceString() is a tangled mess of disgusting garbage.

Introduce a better-factored implementation of Damerau-Levenshtein with options to price trnspositions and build edit strings.

Test Plan: Unit tests.

Reviewers: vrana

Reviewed By: vrana

CC: aran

Maniphest Tasks: T2379

Differential Revision: https://secure.phabricator.com/D5032