lots and lots of changes that probably should have been multiple commits

I really should have split this commit up, but I'm too lazy. To make up
for it, here is a detailed list of everything changed:

* Added brand new irc operator abstraction layer (ircutil.OpProvider)
  - Uses pluggable connector modules for some operations
  - Knows how and when it needs to acquire op to perform other
    operations (like mode sets)
  - Exposes a request to hold op for a duration to other plugins
  - configurable on a per-channel and per-operation basis

* Added brand new event watching system. (Well, this was added in a
  previous commit but was never tested or used. Now it works!)
  - plugins can easily wait for an event to come in, with optional
    timeout
  - this pattern, used in many places, simplifies the design and code
    flow of plugins

* Moved require_channel() function to command.py since it's used several
  places

* Added plugin requirements declarations. Plugins now emit a warning if
  they're loaded and a dependency is not

* Added a default config declaration to plugins. Config directives that
  are not present on plugin load are added and saved automatically

* better error messages and error checking in several places

* cleaned up unneeded imports in a few files

* Removed old admin.IRCOpProvider plugin (is now obsolete)

* Adapted the plugins admin.IRCAdmin admin.IRCTopic, and votd.VOTD to
  work with the new ircop abstraction layer
  - IRCAdmin still needs some work. it should use the individual request
    calls instead of ircop.mode for everything
  - IRCTopic could also use some error checking. Right now op-related
    errors propagate up and dump to the console. They should be caught
    and replied to.

* re-installed the !whois command, but with a required permission. Also
  made the output a bit more friendly.

* Added a required permission for the !echo command

* Added plugins ircutil.HasOp and ircutil.ChanMode to track whether the
  bot has op and the modes of joined channels respectively.

* Temperature plugin now matches U+2212 MINUS SIGN