Description of problem:
The dryRun option on client commands like 'push' and 'pull' has to be handled at each point which performs a mutation operation (eg save document to server or local filesystem, run copyTrans). It is easy to miss this when making changes to the client, which then means that mutation operations are erroneously invoked in dry run mode.
We should change the design of the client so that dry run is implemented as a cross-cutting concern, which errs on the side of safety.
One option would be to whitelist parts of the API which are safe to use in dry run, and adding a client-side interceptor which prevents access to other API points when in dry run mode. We would also need to abstract access to the local filesystem, to avoid creating/modifying files and directories when in dry run mode.