Cleaned up interface and added more abstractions

* Abstracted out implementation types into `CGadget` and `HGadget`.
* Changed raaz-hash and raaz-cipher accordingly.
* Added `HasInverse` typeclass which now supersedes `CipherGadget`. It is more clean and abstract.
* Added `Cipher` type which makes Cipher interface cleaner.