Reverting changes done to Collection::compile() as it breaks other code

The main reaosn compile exsted was to detach the iterator pointers from one
collection to the other. The solution using another iterator still keeps those
pointers, causing old bugs to re-appear
Added Collection::buffered() to make any non-rewidable rewindable
Using push() instead of add() since the latter is php 5.5+