Factor out the open_source and close_source methods.

Subclasses can do data source management in the _read_source() methods.  It
didn't make sense to have the base method call open and close every time,
especially for subs that want a persistent connection.
Fix name of overridden method in TestLoopObserver
Awesome storage observer for disk stats; hardcoded device name