Handle ENOENT on stat() calls in DirectoryWatcherTask

Fixes #57
Add an initService() on VService

This makes it easier to do VService-subclass-specific initialization.
Move initService() call to just before Task Creation

This makes a little bit more sense than in the constructor.

If we put this in the constructor, then initService() is called even
before action-oriented command line options  have been called
(E.g., --tasks (list) or --install)
Some initialization refactoring

- Refactor local task resolution into a separate classmethod,
`resolveDependencies`
- Move runit-install and task list option handlers into a separate
method, `preprocessOptions`.  This is now before `createTasks()`
in the initialization flow.
- Simplify `createTasks()` to only handle task creation logic
Documentation and API consistency

Add docstrings to tons of things.  Also, prepend "_" to many methods
that are meant to be internal/private only.
Reorder some imports
VTask::initTaskThread() to do per-thread Task-specific init
Actually call preprocessOptions...

When committing the initial refactor, I forgot to include this.  Oops.
DirectoryWatcher (/dev/) example.
Add register / clear warnings API

Also add a unit test.

Fixes #51
Implement an easy-to-use thrift client wrapper.

Like writing thrift server code, writing thrift client code requires a
lot of boilerplate, and the core thrift libraries omit a lot of
basic functionality.

This diff adds a new module, sparts.thrift, defining `ThriftClient`

The preferred way to use ThriftClient is to use its class methods, such
as `for_hostport(host, port, **kwargs)` or `for_localhost(port, **kwargs)`.

While ThriftClient is flexible enough to be used directly, it is
encouraged to subclass it in order to reduce the number of required
creation arguments.
Add an fb303 client/server test.

This test case verifies a lot of functionality that was previously
untested, including:

- Basic ThriftProcessorTask functionality
- Fb303::getStatus()
- Basic NBServerTask functionality
- Basic ThriftClient functionality

Fixes #59
Document new thrift client more thoroughly
Fix accidental un-propertization of mock module on tests
Support option() use in VService and subclasses

For consistentcy with VTask
Expose access to options for third-party control

You may want to use the sparts library inside another system that
controls the argparse lifecycle. In this case, use
sparts.get_options(<service or task>) to get the option name(s) and
kwargs that can be used with argparse.ArgumentParser.add_argument().

One example is pytest. In order to expose your service's or task's cli
options as groups when running py.test cli you can use the
pytest_addoption plugin like so:

conftest.py:
```
from sparts import sparts, vtask

from my_service import MyService

def pytest_addoption(parser):
	group = parser.getgroup('MY-SERVICE-AND-TASKS')
	service_opts = sparts.get_options(MyService)
	for sopt in service_opts:
		group.addoption(*sopt.opt.opts, **sopt.opt.kwargs)
	for task in set(MyService.TASKS).union(vtask.get_registered_tasks()):
		task_opts = sparts.get_options(task)
		for topt in task_opts:
			group.addoption(*topt.opt.opts, **topt.opt.kwargs)
```
Provide a customized ArgumentParser

Allows a developer some extra control on the ArgumentParser behavior:
- to use fromfile_prefix_chars or any other __init__ arg
- or to use an instance of an ArgumentParser instantiated by another
  library.
Support nargs in option()
Migrate VService to use options()
Bugfix vfb303 getOption

options are strings