2 and 3 really aren't distinct options. However, 3 as written is pretty much useless. No STL algorithm will use CustomIterator::next. For STL compatibility, you'd write:
// mix of 2 and 3
CustomIterator begin();
CustomIterator end();
and give CustomIterator the standard operator++ and operator*