Add a constructor to Dsn that take a URI

Add a constructor the Dsn that takes a URI.

This change also removes some fields of the Dsn class
that are redundant, and add a final specifier to any
fields that can be.
Yes, I'm trying to find a way to do that nicely. It would be nice to either base all the method on return values (Tuples?) or have everything modified by side effect.