Secure Random

Adds new SecureRandom class for generating securely random data. Also updates a few pieces of code to use SecureRandom, most significantly Key in the browser (Key in node uses OpenSSL, and we still rely on that for random number generation).

In the browser, the best way to do random bytes is to use window.crypto.getRandomValues (or window.msCrypto.getRandomValues in IE). The new getRandomBuffer function will simply fail if there is not a secure random bytes generator available (or if the system entropy is low). Old browsers are not supported with this method. But that's fine - they are not secure.

In the future, we may choose to add other sources of entropy to generate random numbers even on insecure systems. Or maybe not.

Another method getPsuedoRandomBuffer is also provided for when you don't want to the possibility that the function will fail due to lack of entropy and are willing to live with insecurely random data.