removed equals() from range interface because it is clumsy
- implementations always need to downcast their argument as overloading
  is not possible
- equals() is not symmetric: for a class C deriving from B, in turn
  deriving from A, C.equals(B) will fail, but B.equals(C) will compare
  two types B
- it does not help the implementor at all compared to specializing the
  == and != operators directly (cfr next() which has simplified
  semantics compared to the ++ operators)
downside: sometimes a static_cast will be needed to compare parent types
upside to the downside: static_cast doesn't need RTTI :-)