might want to change this to 'undefined-value', this behaviour could be clarified a bit more for maintainability sake, even a note in iterator.js to make sure it's obvious that the `undefined` at the end is being used to signal the end. My first reading had me confused because `[].shift() === undefined` but then I realised you were still checking `this.buffer.length` so you'd never be doing a `shift()` of an empty array.