Return SizedIteratorRanges from ranges::range for RandomAccessIteratorRanges and SizedIterables

The interface of `ranges::range` consists of:

- `ranges::range(Iterator, Sentinel, Size) -> sized_iterator_range`
- `ranges::range(Iterator, Sentinel) -> iterator_range`

However, when calling `ranges::range(Iterator, Sentinel)` with `RandomAccessIterator`s, we can 
compute the range size in `O(1)` and return a `sized_iterator_range`.

Furthermore, some containers like `std::list` provide only `BidirectionalIterator`s, but they have
an `O(1)` `size()` member function.

This patch changes `ranges::range` interface to: 

- `ranges::range(Iterator, Sentinel, Size) -> sized_iterator_range`
- `ranges::range(Iterator, Sentinel) -> sized_iterator_range` (if possible) / `iterator_range`
- `ranges::range(Iterable&) -> sized_iterator_range` (if possible) / `iterator_range`

The `ranges::range(Iterable&)` dispatches to a `sized_iterator_range` if the `Iterable` has `RandomAccessIterator`s or `ranges::size(Iterable&)` can compute its size (which is `O(1)`). Otherwise it returns an `iterator_range`.

Note:  the `algorithm/equal.cpp` test used to perform one comparison in the modified `CHECK` clause when comparing two `RandomAccessRange`s even tho they had different sizes. Now it doesn't need to perform any comparison at all. 
> Gonzalo didn't know the ins and outs of my code when he made the pull request we're commenting on. I closed this pull request since it's not needed.

Yes, this pull-request was based on a misunderstanding I had. Sorry about that.

@sean-parent I should have probably used `size` there (instead of `distance`). If I got your points rights, the current `size` function works just the way you describe it should.  It is always `O(1)` since it requires a `SizedIterable`, which is just an `Iterable` whose size can be computed in `O(1)`, for example because:
- the size is stored within the `Range`, 
- the `Iterable` has an O(1) `.size()` member function,
- the `Iterable` provides `RandomAccessIterators`.

Otherwise the arguments of `size` don't model the `SizedIterable` concept, `size` won't compile, and the user will need to use `distance` which won't be `O(1)`.