Memory usage improvements.

Another weekend spent poring over memory diagnostics and I think I've
finally got the daemon memory optimized. This is the first time I sat
down with Python's resource module and just started to go at the code
basically bisecting to find where the reported usage rose.

To my surprise, it wasn't an actual memory leak (although I guess I
should have known when all of the fancy tools kept telling me the number
of objects was level), but it was that every time I touched the
database, memory usage would skyrocket. Now, with writeback on (which
was the default) I would expect that, but when your memory usage grows
by 8M (which I assume is 2x pymalloc blocks) when *overwriting* a 500k
value something's wrong.

With writeback disabled (--nowb), the memory usage flattened out, but
the daemon was unresponsive. So, now that I have a properly threaded
daemon, I decided to make it work.

8 - 10 hour tests conducted over the weekend show about a 50% memory
reduction running under the same conditions over that period. For
example, going from >90M usage to ~45M.

- Shelf modified to only touch disk on close/sync and possibly read.
  Which means the fetching threads only have to hit disk at most once on
read, and never on write. Before it was the opposite.

- Syncs are now only done from the main thread, not the fetching or
  worker threads. This speeds them up and hides the write overhead in
the main thread along with the other maintenance tasks.

- Feed.items no longer exists. It was intended to be a sort of quick
  cache, but was never populated aside from item ids (a cached index, I
suppose) and in practice the disk is fast enough. Especially when the
client is also loading stuff in the background. This simplifies feed.py.

- Minor memory optimizations in feed.index(), particularly not making a
  duplicate list of items or feed.items at all.

- --nowb doesn't exist anymore for obvious reasons
Make fetches all happen from maintenance thread

This allows us to get rid of fetch_lock as well as currying multiple
update requests into a single action.
Close dangling file handle
Add plugin control options

--noplugins will disable all plugins, but can be overridden by adding
--enableplugins "one two ..." and normal operation can disable single
plugins with --disableplugins "one two ..."

This is mostly to aid testing, but may be useful otherwise.