Implement asymmetric encryption

@mikaelletang Here's my take on asymmetric encryption. As you suggest, I've broken the algorithm into two interfaces - Symmetric and Asymmetric. The difference is I've added the Encryption namespace with a Symmetric encryption class and an Asymmetric class. These are responsible for the verification and signing/hashing and require an algorithm. As you shouldn't need to care what type your algorithm is just to create the encryption, I've also created a factory that takes an algorithm and returns the correct instance of encryption.