Add checks to verify correctness of RSA/DSA/ElGamal keys

When the various components are assembled into an RSA,
DSA or ElGamal key via the construct() method, we must verify
as much as possible if the result is indeed a valid key.

**NOTE**: this patch also rolls back introduction of the `Crypto.PublicKey.KeyFormatError` exception. That was done with the DSA key import functionality, but I think there is still not enough consensus of how exceptions should be introduced: the `ValueError` is now thrown instead of `KeyFormatError`.