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;
    ...
```
> If somebody misses a dependency in code, all unittests will pass, we will ship it, and clients' code won't compile

This is a big problem with how we test things. `version(unittest)` is crucial in reducing compilation times and it needs to stay. One option could be to have some synthetic application that references all symbols from Phobos to ensure they work in release mode. I wonder if tweaking auto-tester in that regard can be an option @braddr