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;
    ...
```
I'm not sure how it's fixed? We still have global imports that are only included in unittests. We are currently unable to catch an error where code that depends on these failed to do a proper import.

IMO, this is worst than an unconditional import.