Perform push operations synchronously.

Each call to push will increment a counter of pending push operations,
then launch a remote push in the background if one is not already running.
The background operation will clear the counter before starting.
After it completes, it will check the counter and relaunch itself if needed.
This will prevent race conditions that occur when multiple push operations
are in progress at the same time.

Push and pull operations will still not occur simultaneously, as always.

Fixes #272