Improve crypto hash performance by optimizing string handling

1. Move all the string/byte conversion stuff into the `StringBytes` class.
2. Use a similar trick to the `StreamWrap::WriteStringImpl<encoding>` into the node::crypto::Hash/Hmac/Sign/Verify classes.
3. Optimize away a needless Buffer creation in stream.Readable.  (It was converting to a Buffer in some cases, then immediately converting back to a string.)

There should not be any externally visible API changes, unless someone was relying on the badly broken `node::Encode()` behavior with encodings other than BINARY or UTF8.

This fixes #5015, but only if you specify an encoding for the output.  If you get the digest as a Buffer, it's still slow, but no slower than doing `var b = new Buffer(hash.digest('binary'), 'binary')` in v0.8.  (For that, it's slightly faster, actually.)  We *could* conceivably make that faster by using a slab allocator, but that would introduce additional complexity that would only make the planned Buffer refactoring in 0.12 more difficult.

TODO: Apply similar optimizations to DiffieHellman, Credentials, CryptoPair, etc.  But I'd like to get feedback on the approach before proceeding further.

Suggested reviewers: @indutny @bnoordhuis @trevnorris.