Change the verification flow to support asymmetric algorithm

Hey @emarref , here comes a first stab at supporting async algorithms.
It required quite a lot of modifications, mostly around the key/secret management.
What I've done:
- algorithm classes now implement both 'sign()' and 'check()', both taking a key/secret as parameter
- the JWT serialize() and unserialize() take a key as argument (signingKey and verificationKey)
- the Context can be given a verificationKey as argument

Pending:
- Tests for the 'None' algorithm (it's very possible that it doesn't work)
- Fix some ugly 'require_once' in the RS algo tests (I am not yet super familiar with the autoloading)
- There's some duplicate code around preparing the message used by the signature - used both in Jws::getUnencryptedSignature and the AlgorithmVerifier::verify




No such thing as a check for an algorithm. An algorithm simply knows how to hash a value and return it.