Add several checks for range.slice

Add rest of implementation to range<Iterator>::slice

A note on the implementation of range<Iterator>::slice. It is
inneffecient, in that it never counts back from end. It always starts
from the beginning. The reason for this is to cut down on large amounts
of code, and then having to worry about the various amounts of logic.
Without a doubt, slice(n, n) is the most complex function in
range<Iterator>. However, I was able to knock out most of the while and
if statements to just a few. This means that a bidirectional in the
worst case will still have O(n - abs(start)) lookup. However, a small
optimization is made to start from 'start' after it is found and then
increment to end from a copy of the begin iterator. This means that the
slice itself (for both lookups combined) will only traverse a forward or
bidirectional range *once*. I'm placing this note here to bring it up
again later in the documentation.