Added function for grabbing the underlying iterator

This is useful if you come into contact with an any_iterator of a known
(to you, not the compiler) type, that you then want to cast to an
iterator implementation, and then extract the original iterator.
Moved end-iterator checks into the proper funcs

Checking if an iterator is past the 'end' iterator is now the
responsibility of whatever function chooses to dereference the iterator
for comparison. So far only two functions, namely 'exact' and 'lambda'
do this, and thus require the extra safeguard.

This is to fix a bug, where for instance a sequence of {something, maybe
something}, would return false, even if the first 'something' was indeed
present, simply because the end of the input range would be exceeded in
matching the first statement, and the previous code would simply
conclude that the second statement could never match anything, as the
'end' iterator had been reached. This was the case, even if the last
'maybe something' expression didn't strictly require anything to be
present, such as the zero_or_*_of expressions.

This also allows the creation of a new expression that could match the
ends of a range, much like regex's '$'