code: function stringToStringTuples (str) {
    const tuples = []
    const parts = str.split('/').slice(1) // skip first empty elem
    if (parts.length === 1 && parts[0] === '') {
      return []
    }
  
    for (let p = 0; p < parts.length; p++) {
      const part = parts[p]
      const proto = protocols(part)
  
      if (proto.size === 0) {
        tuples.push([part])
        continue
      }
  
      p++ // advance addr part
      if (p >= parts.length) {
        throw ParseError('invalid address: ' + str)
      }
  
      // if it's a path proto, take the rest
      if (proto.path) {
        tuples.push([
          part,
          // TODO: should we need to check each path part to see if it's a proto?
          // This would allow for other protocols to be added after a unix path,
          // however it would have issues if the path had a protocol name in the path
          cleanPath(parts.slice(p).join('/'))
        ])
        break
      }
  
      tuples.push([part, parts[p]])
    }
  
    return tuples
  }
docs: string -> [[str name, str addr]... ]