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.
Yeah, let me know which way you would prefer. I had a go at making `extractProtocolInfo` return a list (the schema in a List, reversed) so that item 0 is the protocol, and 1...N are the options. It's not neat though. Making a little Tupple class was more code again.