Add an emscripten crypto API

This gives C code a convenient way to access the crypto functions in node.js or a web browser. In this commit, we add support for fetching random numbers, and making SHA hashes.

Soon-to-be-added functions: a high-level RSA wrapper, and AES functions.

These are useful things for emscripten to accept upstream, because they abstract away differences between node.js and WebCrypto, plus it's tedious boilerplate that application porters shouldn't have to write.

Advantages of using WebCrypto rather than native JavaScript or C implementations via emscripten:
1. Smaller download size
2. The browser's own crypto library gets auto-updated, a bundled library doesn't
3. The browser's implementation is much less susceptible to timing attacks (the JavaScript JIT is not a secure environment for implementing crypto algorithms)
4. It's a well-known audited implementation. Native JavaScript libraries are not considered mature yet, nor is emscripten well-suited to compiling crypto code (can't use fast assembler, or constant-time implementation tricks).
I have to admit, this is not nice... I though of adding another argument "totalLengthHint" to allow the caller give a hint what buffer size the whole hash is going to need, but that seems ugly.

WebCrypto is basically a really rubbish crypto API, why they couldn't get it right is beyond me. The Blink devs vetoed attempts to add an "update" method to the spec, because it was "too hard" to implement safely, then went ahead and implemented it for themselves for internal use in browser chrome only! Crazy.