url: fix/8722

This patch attempts to close this issue #8722:
- [x] feature
- [x] test
- [x] documentation
- [x] fix some style conflicts with `jshint` in test-url.js

R=@indutny, @chrisdickinson :cherries: 
Hm. I think we should try to mirror how `host` (vs. `hostname` + `port`) operates with `path` -- that is:

If `path` is given, it is assumed to include `search`/`query` and `pathname`. If those are not present in `path`, and `path` is given, then they will be omitted from the output of `format`. 

So:

```javascript
// we're matching this behavior: (port is omitted from "host" but "host" overrides port)
assert.equal(url.format({host: 'some.host.com', hostname: 'example.com', port: 8080}), '//some.host.com');
assert.equal(url.format({hostname: 'example.com', port: 8080}), '//example.com:8080');

// "auth" is not considered part of "host"
assert.equal(url.format({auth: 'a:b', host: 'some.host.com', hostname: 'example.com', port: 8080}), '//a:b@some.host.com');
assert.equal(url.format({auth: 'a:b', hostname: 'example.com', port: 8080}), '//a:b@example.com:8080');

// "path" does not include "hash", but does include "search" and "pathname"
assert.equal(url.parse('http://example.com/path/to/thing?q=1#hash').path, '/path/to/thing?q=1')
// "path" overrides pathname
assert.equal(url.format({host: "example.com", path: "/path/to/thing?q=1", pathname: "/anythingelse"}), '//example.com/path/to/thing?q=1') 
// "path" overrides search/query
assert.equal(url.format({host: "example.com", path: "/path/to/thing?q=1", search: "?p=2"}), '//example.com/path/to/thing?q=1')
// "path" overrides search/query even if not given in "path"
assert.equal(url.format({host: "example.com", path: "/path/to/thing", search: "?p=2"}), '//example.com/path/to/thing')
// similarly, "path" overrides "pathname" even if not given:
assert.equal(url.format({host: "example.com", path: "?p=2", pathname: "/anything"}), '//example.com?p=2')
```

to illustrate:

```
+--------------------------------------------------------------------------------+
| href                                                                           |
+----------+-----------+--------------------+-----------------------------+------+
| protocol | auth      | host               | path                        | hash |
|          |           +-------------+------+----------+------------------+      |
|          |           | hostname    | port | pathname | search           |      |
|          |           |             |      |          +-+----------------+      |
|          |           |             |      |          | | query          |      |
" http://     user:pass@some.host.com:65535 /path/name ? search=1&continues#hash "
|          |           |             |      |          | |                |      |
+----------+-----------+-------------+------+----------+-+----------------+------+
(all spaces in the "" line should be ignored -- they're purely for formatting)
```

Setting a key at the higher level should cause `url.format` to ignore all keys at a "lower" level, whether or not that lower key is present in the text of the higher level key (even though "port" may not be present in "host", setting "host" ignores all values for "port").