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.

edit:

Made std.traits.ModifyTypePreserveSTC package and changed both `assumeUTF` and `representation` to use it.

Hm.. It's a bit sickish but:
```d
immutable T ijt = "Hello world!";
T jt = ijt.dup;
```
should work then.