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.
It's probably worth doing the same thing for `protocolSettings` then.