add byCodeunit, byChar, byWchar and byDchar to std.utf

These should form the foundation for higher performance string processing, as they:

1. do not auto-decode
2. are pure/nothrow/safe, depending on the input parameter
3. are lazy
4. do not allocate memory
5. replace invalid UTF sequences with U+FFFD, per the Unicode Standard 6.2, rather than throwing or asserting
6. are composable - completely compatible with ranges and algorithms

Unit tests are at 100%.
Hum... looks like we were a little fast with the whole "lazy pop thing":
http://forum.dlang.org/thread/trqnqtzspoyhggvvftgp@forum.dlang.org

Long story short, if the *last* character in the string is actually truncated, then the `popFront()` of the underlying range will fail, since it will already be empty.

A "fix" would be to add:
```D
if (!r.empty)
    r.popFront();
```
But that check could be more costly than what we are trying to save on? It needs to be fixed one way or the other. @WalterBright ?

I didn't check if `byWchar` is also subject to the issue.