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.

Sorry, I was under the impression that my test script used `-debug`. It doesn't. I'll remove the `nothrow`.

I removed `@trusted` as well - it was just a holdover from the old implementation. For one, the compiler currently accepts this as `@safe`. However, I'm not sure I agree with the compiler that this cast is SafeD. It may not directly affect memory safety, but depending on how we handle UTF in the future, it could affect it indirectly. I've left the function undecorated in terms of safety.

> In any case, this makes me think that maybe it's better if we just don't put any attributes on this function, since it is a template function and the compiler will infer attributes automatically.

When possible it's best to decorate even a function template with as many attributes as possible. For example, if you know that a function template will always produce `pure` instantiations, then decorating the function template with `pure` lets the user know that instances will always be `pure`. Of course, this is a commitment; future implementations must be careful if changed to produce impure instances.