Implemented Collection::stopWhen()

This is usuful when using collecitons for processing large files or
infinite iterators/generators
Initial code for implementing Collection::unfold()

Unfolding can be used to yield more items in a collection than those
originally set into it.
Using an identity function in unfold() is a very common case
Doing that automatically is of great help
Fixing doc block
Refactoring and documenting functions
Update docs for new iterators

Mark them as internal as they are internal implementation details of the
Collection class, and fix some typos.
Fix phpcs error.
Merge branch '3.0-collection-stop' into 3.0-collection-unfold
Merge branch '3.0-collection-unfold' of github.com:cakephp/cakephp into 3.0-collection-unfold
Early return in matchers function
Merge pull request #5445 from cakephp/3.0-collection-unfold

3.0 collection unfold