Fixing put.

Second attempt. This makes it so that put can transcode char and strings of any width, to chars and strings to of any width.

Not only is this convenient, but it also fixes a lot of bugs in `std.format`, which actually relied on put doing it. Up until now, we did not notice, because we tested with `Appender`, which was natively able to do this, but `formatedWrite` actually failed with a simple sink, on the most trivial cases. So this also fixes that (amongst other things):

[x] http://d.puremagic.com/issues/show_bug.cgi?id=9823
[x] http://d.puremagic.com/issues/show_bug.cgi?id=10571

Now, it is also possible to use format on sinks that accepts any string widths (so it is possible to format the output stright as wstring, without allocating). Yay!

--------

More importantly though, I realized there was a *huge* bug in the way `put` works, and the only way to fix it is to change its semantics. This is discussed in more detail in the message boards: