added non_reentrant decorator, fixed ban method, more

non_reentrant decorator added. Decorate methods to make sure only one
invocation of it is running at a time. If another method tries to call
it, it will instead wait for the first invocation and receive the same
value when it completes. Works using twisted deferreds

ban method now kicks and then bans, so that the bot correctly does both
operations in sequence.

non_reentrant decorator significantly reduced the complexity of the
_wait_for_op() method.

Changed how op-requiring tasks deop after they're done

Added test cases to test correctness of non_reentrant decorator