Switch to use promises where possible

Related: explicitly nulling out tile.error prevents a previous stale error from 'sticking' on the next attempt.