Removes cycle's requirement on iterator assignment

Previously the iterator of the iterable being cycled over needed to
support assignment for when the end was reached.  This shortcoming was
exposed when cycling over a range, whose iterator has a const step data
member, and hence cannot be assigned with operator=.  Instead, the
destructor is explicitly invoked and the iterator is reconstructed using
placement new.
Removes operator= from range iterator
Adds comment
Removes requirement on iterator having operator=