async function set (url, key, value, opts) {
  await setupPromise
  var origin = opts && opts.dontExtractOrigin ? url : await extractOrigin(url)
  if (!origin) return null
  if (opts && opts.normalizeUrl) origin = normalizeUrl(origin)
  return cbPromise(cb => {
    db.run(`
      INSERT OR REPLACE
        INTO sitedata (origin, key, value)
        VALUES (?, ?, ?)
    `, [origin, key, value], cb)
  })
}
@param {string} url
@param {string} key
@param {number | string} value
@param {Object} [opts]
@param {boolean} [opts.dontExtractOrigin]
@param {boolean} [opts.normalizeUrl]
@returns {Promise<void>}