Implement a proxy for a container to implement concurrent behavior (#2107)

A proxy that wraps a Container. It is used to keep track of the lifecycle
of a container and to guarantee a contract between the client of the container
and the container itself.

The contract is as follows:
1. Only one job is to be sent to the ContainerProxy at one time. ContainerProxy
   will delay all further jobs until the first job is finished for defensiveness
   reasons.
2. The next job can be sent to the ContainerProxy after it indicated capacity by
   sending NeedWork to its parent.
3. A Remove message can be sent at any point in time. Like multiple jobs though,
   it will be delayed until the currently running job has finished.
1 file changed