X509 interfaces

Replaces #1267.

**Update: simplified interfaces so the below questions are irrelevant until we expand them in future PRs**

Two outstanding questions:

- Do we want to blow up when an X509Name has multiple identical OIDs in a single Name?
- Do we want to blow up when an X509Certificate has multiple extensions with the same OID?

These are both things you Should Not Do™, but since it's all ASN.1 under the hood nothing technically prohibits the existence of certificates and names that do this.

A bit more detail than is in the PR:

- `version` will return an enum object that will correspond to v1 or v3. Leaving it an integer is a mistake many other APIs have made to their sorrow.

I've decided to go down the path of keeping the interface small and having `get_extension` and `get_item`. When the requested OID is not available we will raise the exceptions that are added here.
Sounds good, going over to hex is pretty easy for an int.

On Mon Nov 24 2014 at 2:17:37 PM Paul Kehrer <notifications@github.com>
wrote:

> In docs/hazmat/primitives/interfaces.rst:
>
> > +
> > +    .. versionadded:: 0.7
> > +
> > +    .. method:: fingerprint(algorithm)
> > +
> > +        :param algorithm: A
> > +            :class:`~cryptography.hazmat.primitives.interfaces.HashAlgorithm`
> > +            that will be used by this context.
> > +
> > +        :return: The fingerprint using the supplied hash algorithm as bytes.
> > +
> > +    .. attribute:: serial
> > +
> > +        :type: int
> > +
> > +        The serial as a Python integer.
>
> Serials are usually represented as hexadecimal or decimal by parsing
> libraries. We could return the bytes but I think we'd just end up causing a
> new class of bugs as people tried to convert it into what they expect.
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/pyca/cryptography/pull/1442/files#r20827158>.
>