This changes the data structure for `Url`: Rather than having multiple `String` (or `Vec<String>`) components, this uses a single `String` that contains the serialization of an URL and some indices into it to access components in O(1) time. This saves on memory allocations and makes serialization and some other methods very cheap, as they return `&str` rather than building a new `String`. As a consequence, most of `src/lib.rs` and `src/parser.rs` had to be rewritten.