implements send job_error_occurred notification

When an ERROR scenario occurs while processing a job, we generally update the job status and its timeout using worker.client.update_job() method. But currently there is no notifications sent for the error
occurred.
This patch includes the sending of ERROR notification along with updating of job status as similar to other job processing notifications.
implementation includes:
- introduce a snapshot._job_error_occurred() to update the job status and send appropriate notification on ERROR
- modify worker.process_job() exception handling logic to update the job status and send job ERROR notification
- include the error message as part of the notification payload
- add more/modify tests for testing send error notification impl.