std.range package

~~Needs #2684.~~

[Issue 13253 - use more scoped imports in phobos](https://issues.dlang.org/show_bug.cgi?id=13253)
Please, freeze all other std.range commits!
Known PR that should be blocked:
1. #2655
2. #2647
3. #2606
4. ~~#2024~~ (only one comment line, can be merged)

### `std.range` 
Contains D ranges (zip, iota etc.).
#### Global imports
```D
public import std.range.constraints;
public import std.range.interfaces;
public import std.array;
public import std.typecons : Flag, Yes, No;

import std.traits;
import std.typetuple;
```
### `std.range.constraints`
Contains range `has*`, `is*Range` primitives and convenience functions for
manipulating ranges (like `put`).

#### Global imports
```D
public import std.array : empty, save, popFront, popBack, front, back;
import std.traits;
```
I think the next PR will move `empty, save, popFront, popBack, front, back` into `std.range.constraints`.
The reason is to don't import `std.array` globally to all Phobos modules.
`std.range` \ `std.range.constraints` is imported in `std.array` anyway.

#### All scoped imports
```D
template hasSwappableElements(R)
{
    import std.algorithm : swap; 
    ...
```
```D
//Helper function to handle chars as quickly and as elegantly as possible
private void putChar(R, E)(ref R r, E e)
if (isSomeChar!E)
{
    ...
    static if ((wsCond && E.sizeof < wchar.sizeof) || (dsCond && E.sizeof < dchar.sizeof))
    {
        ...
    }
    else static if (wsCond || csCond)
    {
        import std.utf : encode;
        ...
    }
    else static if (wcCond || ccCond)
    {
        import std.encoding : encode;
        ...
    }
```
```D
ElementType!R moveFront(R)(R r)
{
    static if (is(typeof(&r.moveFront))) {
        return r.moveFront();
    } else static if (!hasElaborateCopyConstructor!(ElementType!R)) {
        return r.front;
    } else static if (is(typeof(&(r.front())) == ElementType!R*)) {
        import std.algorithm : move; //<<<<<<<<<<<
        ...
///ditto 
ElementType!R moveBack(R)(R r)
///ditto 
ElementType!R moveAt(R)(R r, size_t index)
```
### `std.range.interfaces`
Contains interfaces and classes.
#### Global imports
```D
import std.range.concept;
import std.traits;
import std.typetuple;
```
#### All scoped imports
```D
// CTFE function that generates mixin code for one put() method for each
// type E.
private string putMethods(E...)()
{
    import std.conv : to;
    ...
```
OK, that's fine. I wasn't even sure if you were acknowledging the issue I was bringing up. That said, just because it's wrong somewhere else means we can keep doing it, and (unless I'm mistaken), this particular import *does* come from you...

mixing in dummy ranges in global namespace (AFAIK) is not an issue since:
1. You are just declaring private objects (it doesn't add any extra imports I think).
2. These can only be used by unittest code anyways.

You are working on cleaning imports: When we did our "first round" of cleaning, we broke a fair amount of client code because of uncaught missing imports. I'm hoping we learn from this.