ContentList -- an optimizing wrapper around a list of Contents

Many operations return a list of Content instances, fetched from a Node
queryset. Many common operations on this list only need information in
the Node, so it's wasteful to always fetch the Contents.

The optimizations it performs:

  - Prefetches the Content instances in bulk
  - Implements ``__contains__`` without fetching Contents at all
  - Implements ``__len__`` without fetching Contents at all
  - Can calculate Content _classes_ with fetching the Content instances

It behaves exactly like a list, so this is backwards compatible. It does
have a new public property -- `content_classes` -- which is used to
retrieve a list of Content classes when full instances aren't required,
such as when you're only doing an `isinstance` check.
Override treebeard's `is_root` with one that never does a query
Eliminated an extra query when prefetching a leaf node

For leaf nodes, we shouldn't have to do a Node query when prefetching.
Treebeard does a weird useless query: `SELECT * FROM node WHERE id = 12
AND id != 12`. We know better, so provide a get_descendants that returns
an empty queryset for leaf nodes.
Refactor the right/parent node fetching

This somewhat-complex logic was used in two places. Now there's a
`get_nodes` method that returns a (right, parent) pair.
Selectively cache Content.node

The node reverse relationship is queried a lot. It's hard to always
cache it, because then we have too many node instances, and some are out
of date. (See test_node_cache). Instead of indiscriminately caching
them, careful placement of node assignments can reduce the number of
queries.