refresh = async () => {
  if (_refreshing || !(await hasToken())) return

  _refreshing = true
  await sendMessage({refreshing: true})
  try {
    await timeout(Promise.all([syncOptions(), syncLists()]), 20000)
    await sendMessage({refreshed: {success: true}})
  } catch (err) {
    logger.error(err)
    await sendMessage({refreshed: {success: false}})
  } finally {
    _refreshing = false
  }
}
latest sync logic
date: 2019-01-21

options:
 - record the time when options are changed
 - get remote options updated time
 - if local time is later than remote upload local options to remote and set remote time, else if local time is before than remote download the remote options and set local time

lists:
 - record each time of list be updated (UPDATE_LIST_BY_ID)
 - upload local operations to remote (include the time and save in server storage)
 - compare the latest updated time of each list
 - if local time is before than remote download that remote list