Improve the performance of DList.isEqual

This is achieved by avoiding duplicating the Key, which could
potentially be a very large type.

The more obvious way of doing this would be to use an Int, where
all the lefts are -1 and all the rights are +1. And then use .sum
== 0 to make sure there is the same amount. This indeed is even
faster than the approach here, but suffers a fatal flaw -- it can
overflow giving a false equality.

Using longs on the other hand is elegant, but is not very space
efficient. So this approach uses and booleans and does the count
using a long.