improve key parameter types

Key parameter types are poor in that it is possible to construct a
Key with a Kty that does not match the KeyParameters, and pattern
guards are used to parse keys.

Refine the types so that it is no longer possible to construct a Key
with mismatched Kty and parameters values.

This involved defining distinct types for EC, RSA and Oct rather
than those values existing as constructors of the Kty sum type.
The new KeyMaterial sum type then enforces matching of EC parameters
with EC kty, RSA parameters with RSA and so on.

Implement the smaller, simpler parses for these new types and
dispense with pattern guards since alternation (<|>) is now
sufficient.

Pleasingly, with a healthy does of the Aeson "with" functions, the
diffstat for this whole change is:

 2 files changed, 77 insertions(+), 73 deletions(-)