Prevent concurrent creation of duplicate connection pools.

Did you think that because a gevented process is basically still
single-threaded, it's free of your normal concurrency woes? Well, not so much.
Consider the following test case:

---
import random
from gevent import monkey; monkey.patch_all()
import gevent

def maybe_update_shared_dict(k, v, d={}, final=False):
    if d.get(k) is None:
        gevent.sleep()
        d[k] = v
    return d.get(k)

def test():
    print maybe_update_shared_dict('a', random.randint(0, 22))

threads = [gevent.spawn(test) for _ in range(10)]
gevent.joinall(threads)
---

Only the first call to maybe_update_shared_dict should store a value in the
dictionary d, and all the other greenlets should read it. But that's not
actually what happens, because concurrency.

This is basically what we were doing when creating IMAP connection pools. This
is an issue if you start the syncback service and it tries to execute a bunch
of actions for the same account at once -- you end up creating a bunch of
connection pools. Add per-account locks to prevent this.