campaigns: Use heap for changeset syncing
Created by: ryanslade
This PR rewrites the changeset syncer to use a heap.
The downside is that we have long lived state, but we avoid the possibility of items getting queued more than once in the high priority channel.
Follow on from https://github.com/sourcegraph/sourcegraph/pull/8653