Fixed ImageWriter::executionHash to use the provided context.

Also added the writeMode and channels plugs to the hash, and added a short-circuit when the file or input image are empty.
ExecutableRender::executionHash now accounts for the input node and the context.

Note that we are hashing the address of the input node to work around the lack of a hierarchyHash. This should be safe because executionHash needs to be valid during Dispatcher::dispatch(), and no nodes should be deleted during that time.

I haven't added tests for ArnoldRender because I can't run it locally, but the OpenGL and RenderMan tests are nearly identical, and ArnoldRender doesn't override executionHash.
SceneWriter::executionHash now accounts for the file name, input node, and the context.

Note that we are hashing the address of the input node to work around the lack of a hierarchyHash. This should be safe because executionHash needs to be valid during Dispatcher::dispatch(), and no nodes should be deleted during that time.
ExecutableOpHolder::executionHash calls the base class first.

Also added tests, and we are returning the default hash if no op is set.
ExecutableOpHolder::execute performs context substitution on its parameters.

This is a workaround until scoping the Context takes care of it automatically.
Defined ObjectWriter::executionHash and added tests.

Fixes #878