JobType Rework

This pull request is a rework of the base `JobType` class and associated modules.  The changes here are based on a thread on [discuss@pyfarm.net](https://groups.google.com/a/pyfarm.net/d/msg/discuss/er2e44kiPBE/JwVnOn43U-4J).
> If I had to guess, I'd say that, probably, the stop_() method doesn't stop the assignment, but rather just returns a deferred that will fire when the assignment has stopped, 

Yep, that's exactly what this does.  After looking at it again the next day however I can see why it's not obvious at a glance as to what it's supposed to do....

> If this is true, that raises some more issues:

> We are calling restart_if_necessary on the start deferred. Immediately after an assignment has been started is really the worst time for restarting the agent.

I didn't think it was a very good time either and as I started writing tests for this bit of code it became more apparent that design wise it seemed like it create quite a few issues.  I'm happy to change it, I just have not done so yet because I wanted to bring it up with you first since you added this code in originally and it's something we both reviewed.

> If start_() starts the assignment, then to be consistent, stop_() really needs to stop the assignment. If you just want to get a deferred that fires when the assignment has stopped (for some other reason), then you should create a method like get_stopped_deferred() or have start_() return a tuple of deferreds.

Agreed, the current implementation needs to do something different.  I think that what I had started to do with the started/stopped properties can be used to help build something better so I'll probably start to modify this once start/stop's private methods are developed further.