CAS-1468: X509SubjectAlternativeNameUPNPrincipalResolver

Microsoft (and others) support the embedding of a UserPrincipalName object as a SubjectAlternateName extension within an X509 certificate, allowing properly-empowered certificates to be used for network logon (via SmartCards, or alternately by 'soft certs' in certain environments). An X509UserPrincipalNameResolver class would make the use of CAS as a web single sign on solution incredibly easy for AD domains with an existing PKI infrastructure.
In case of catching an exception in that piece of code and letting null (DERObject) get into `ASN1Sequence#getInstance` would just return null. So this particular code is "safe". Here's the entire `ASN1Sequence.getInstance` implementation:

```java
/**
     * return an ASN1Sequence from the given object.
     *
     * @param obj the object we want converted.
     * @exception IllegalArgumentException if the object cannot be converted.
     */
    public static ASN1Sequence getInstance(
        Object  obj)
    {
        if (obj == null || obj instanceof ASN1Sequence)
        {
            return (ASN1Sequence)obj;
        }

        throw new IllegalArgumentException("unknown object in getInstance: " + obj.getClass().getName());
    }
```

I just explicitly tested it with throwing IOException on purpose. It's fine.