This makes the required set type of df_iterator a normal set again.
Previously, you had to have a set type with the completed method,
which meant not being able to reuse exist set types.
I'm a bit unhappy about the overload hack required to do this, so
adding some reviewers to see if they know a better way.
(PostOrderIterator.h has a similar requirement that i'll fix as a
followup, but it requires more work).
Completion is also really a function that belongs as part of the
iterator, but it was non-trivial to simply make the iterator take it
as a function without a lot of other changes (due to the need for a
default argument, etc), due to the fun of trying to use lambdas as
template parameters.
the 'return' here might be a bit misleading/confusing - since the return type of call_completed_method_imp is void, this statement is only valid if 'completed' returns void as well. Probably drop/remove the 'return' here.