Implement Char::encode_utf16

And clean up encode_utf8 a bit.
Add tests for Char::encode_utf{8,16}
Decode non-BMP hex escapes in JSON

Fixes #13064.
auto merge of #13469 : kmcallister/rust/utf16, r=huonw

This fixes two separate issues related to character encoding.

* Add `encode_utf16` to the `Char` trait, analogous to `encode_utf8`.  `&str` already supports UTF-16 encoding but only with a heap allocation.  Also fix `encode_utf8` docs and add tests.

* Correctly decode non-BMP hex escapes in JSON (#13064).