(PE-4372) Added utilities for alt dns names

* Able to add extensions to a CSR
* Added utilities to create an Alt. DNS names extensions

This PR is for review only so people can start taking a look at it while I write some tests.
I find this hard to read, and I think I've only ever seen this style once during my Java-heavy days.  In order to break up the long signature, I typically see the arguments expanded to multiple lines, and since most of these throw multiple exceptions, just having a single line dedicated to listing those.

So something like:
```java
public static Map<String, Object> getExtension(X509Certificate cert, String oid)
    throws IOException, CertificateEncodingException
```

Or if there are many arguments:
```java
public static Map<String, Object> getExtension(X509Certificate cert,  String oid,
                                                                           Foo foo, Bar bar, Baz baz)
    throws IOException, CertificateEncodingException
```

I guess what that means is the return type is on the same line as the method name, the exceptions are always on their own line underneath everything, and we introduce newlines in the argument list when we need more space.

Not a blocker, just my formatting thoughts.