Redirect job IO logs to disk using a new extcmd delegate
Create the slugify function to generate valid filenames from job.name
"[r=zkrynicki][bug=][author=sylvain-pineau] automatic merge by tarmac"
scripts/rendercheck_test - added missing import for errno (LP: #1103343)
  jobs/rendercheck.txt.in - fixed command string to report the correct exit
  code to checkbox
"[r=roadmr][bug=1103343][author=bladernr] automatic merge by tarmac"
removed the unneeded open() in with session.open(), contextmanager already calls open()
Save a session subset

Save (job_state_map and desired_job_list) to a JSON file. Added the
necesarry __getstate__() methods to help serializing involved class
instances. Added a SessionStateEncoder to JSON encode the session
instance, adding the __class__ and __module__ values to all serialized
objects. Added the session.persistent_save() method and sync the session
data file using os.fdatasync().
Added classmethods to create instances after loading JSON objects to dictionaries
Session can now be resumed from the JSON file

Added the update_job_state_map method to avoid modifying the
job_state_map with __init__(), This is required to decode JSON objects
as dict and create session instances. Resuming/updating SessionState
with previous data requires an object_hook parameter (dict_to_object),
used to create python class instances from dictionaries.
previous_sesion_file() check if a previous session file exists and
returns its full pathname. resume_prompt() is for now a pure CLI prompt
to get user input.
Added some empty lines to SessionState comments, just for readability
Added encode/decode tests for JobDefinition, ResourceExpression and JobResultTests Fix broken tests where session.update_job_state_map() is now missing
Fix test_box.py by setting XDG_CACHE_HOME to a temporary folder to avoid looking to real data
Added tests to cover the persistent storage feature and session classes encode/decode