[WIP] X509 Interfaces

This PR will define X509Certificate and X509Name interfaces. Extensions probably belong in another PR...

- [x] X509Certificate
  - [ ] Determine what `signature_algorithm` should return
- [ ] X509Name

X509Name (X.500 DistinguishedName really) are conceptually an ordered dictionary. I'm not sure how we want to represent that. We could allow access to the values as if it's a dictionary with the keys being the short names as well as OID for the cases where no short name is known to the underlying library, but we'll also need a way to show ordering (maybe a function to output a list of tuples like `[('O', 'My Org'), ('ST', 'State')]`?). Interested in ideas here.
How are we going to represent extensions?