add HMAC support

* replace HashConstructor and CipherConstructor with HashSpec and CipherSpec
* this allowed adding MACSpec and the ability to use HashSpec as a parameter of MACSpec.New()
* it also changes the creation pattern from Hash()/Cipher(...) to Hash.New()/Cipher.New(...)
* but also allows addition of Cipher.NewReader/NewWriter which is nicer than before
* and paves the path for better PKey API