replace option::iter with a BaseIter impl + fixes

A small step towards fixing #2827