All of this allows the iterator to be used with common STL facilities,
standard algorithms, etc.
Doing this exposed some missing facilities in the iterator facade that
I've fixed and required some work to the actual iterator to fully
support the necessary API.
Is there a reason these operators are written out explicitly like this, rather than as:
? I guess it makes it clearer this is calling into a function implemented by the derived class? *shrug* no worries.