Split out Job and JSON decoding / encoding.  Fixes #40.