Use .lock files to prevent race conditions

Issue #12

Adds `infra.retry.synchronize` decorator to ensure only one call to the
decorated function can happen at once, and other calls block until it’s
done.

Right now only protects operations happening locally that would
conflict when running two processes against different apps.
use `str.format` instead of `%` expression
Zero-downtime deployments

Issue #10

When deploying a new version of an app, ensures traffic moves from the
previous version with no service interruption. This is done by waiting
until new instances are `InService`, and then removing the previous
instances (this means for a brief period both the new version and
previous version receive traffic).

Also ensures the same number of instances in the load balancer between
deployments.