code: func (i *iterator) Next() (key []byte, value []byte) {
  	if i.err != nil {
  		return nil, nil
  	}
  
  	if i.dataBucket == nil {
  		return nil, nil
  	}
  
  	if i.nextKeys == nil {
  		return nil, nil
  	}
  
  	if len(i.keyCache) == 0 {
  		newKeys, err := i.nextKeys(i.prepCursor, i.indexCursor)
  		i.prepCursor = false
  		if err != nil {
  			i.err = err
  			return nil, nil
  		}
  
  		if len(newKeys) == 0 {
  			return nil, nil
  		}
  
  		i.keyCache = append(i.keyCache, newKeys...)
  	}
  
  	nextKey := i.keyCache[0]
  	i.keyCache = i.keyCache[1:]
  
  	val := i.dataBucket.Get(nextKey)
  
  	return nextKey, val
  }
docs: // Next returns the next key value that matches the iterators criteria
  // If no more kv's are available the return nil, if there is an error, they return nil
  // and iterator.Error() will return the error