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 talking about the imports. They may or may not be correct. Heck, it's not about the imports, it's about the functions that depend on them.

The issue is that we currently *aren't* covering whether or not our standard non-unittest functions have the correct imports. As it stands, especially with your imports cleaning, we have absolutely no way to know if any of these functions in range had an actual dependency on algorithm, which you forgot to locally include. Or somebody else in the future might write a function that requires std.algorithm.

We will fail to compile for literally every client, and not even see it.

It should be kept as simple global import, or scoped import. `version(unittest)` is evil and dangerous.