haskell Generic cryptography public keys algorithm types vincenthz/hs-crypto-pubkey-types