Bugfix: actually leave the dispatchGroup when aborting hashes early, otherwise we deadlock.
Detect hash collisions within a set of files, and abort.

Previously it'd just silently overwrite the earlier entry, causing it
to just plain forget that file existed, which is of course extremely
undesirable.