allow one next() at a time, improve end() handling