Enhance `util.join(aRoot, aPath)`

- If aPath is a URL or a data URI, aPath is returned, unless aPath is a
  scheme-relative URL: Then the scheme of aRoot, if any, is prepended
  first.
- Otherwise aPath is a path. If aRoot is a URL, then its path portion
  is updated with the result and aRoot is returned. Otherwise the result
  is returned.
  - If aPath is absolute, the result is aPath.
  - Otherwise the two paths are joined with a slash.
- Joining for example 'http://' and 'www.example.com' is also supported.