Simplify locking around acquiring Node resources

task_manager.TaskManager and resource_manager.NodeManager were both
locking resources, but in different ways.

TaskManager used a DB-backed lock to guarantee cross-host exclusivity of
non-shared locks, even in the face of a conductor going offline.

NodeManager used lockutils.synchronized to guard creation of
instances of itself. For each node id, this class acted like a
singleton. Additionally, it kept references back to each TaskManager
which had acquired either shared or exlusive access to that Node. This
back-reference (and the related garbage collection) was not necessary
because most access was done within an exclusive lock context, and
therefor the benefit of resource caching was never realized.

This patch replaces NodeManager with a simple NodeResource class.  It is
now just a container to store and easily access objects associated with
a node, namely the node's port(s) and the node's driver object.

This patch also moves the driver loading out from NodeManager and into
TaskManager. As a result of this, significant refactoring of the unit
tests had to be done to mock the extension loading in a different way.

This patch updates the unit tests and module documentation accordingly.

Change-Id: Ic6fc1e198cd4979d3c4746db821ae959f42f4678