Fix assumeUTF

Felt [#2341](https://github.com/D-Programming-Language/phobos/pull/2341) completely lacked quality control, so here's a few fixes.

* Now supports shared (though not tested because `validate` does not support it, but a non-debug build will support it)
* Shortened implementation considerably
* Uses template constraint instead of static assert to reject invalid calls at the call-site
* Documentation now references `representation` instead of `assumeUnique`. The relationship between `assumeUTF` and `assumeUnique` is pure trivia, while `representation` is its counter-function.
* Annotated with nothrow, and annotated unit tests.
* Fixed wrong naming convention used in one of the unit tests.

I have this a feeling this is duplicating (in a possibly buggy way?) what we already have in `traits` and know as `ModifyTypePreservingSTC`. You should make it package and re-use it:

```D
alias ToUTFType(T) = TypeTuple!(char, wchar, dchar)[T.sizeof / 2];
auto asUTF = cast(ModifyTypePreservingSTC!(IntToChar, T))arr;
debug validate(asUTF);
return asUTF;
```