Reliably delete a container with its objects

This PR is a (hopefully) final attempt at providing a method to reliably delete a container along with its constituent objects. The crux of the algorithm implemented by this PR is:

1. Get the list of objects in the container.
2. Attempt to delete them using the batch delete API.
3. Attempt to delete the container using the container delete API.
4. If step 3 succeeds, we are done!
5. If step 3 results in a `409 Conflict` error (indicating that the container is not actually empty), start over with step 1.
6. If step 3 results in a `404 Not Found` error (indicating that the container is not found), we are done!

Note that the existing methods to delete a container (`$container->delete()`) and to delete a container along with its objects (`$container->delete($deleteObjects = false)`) are preserved so this change is backwards compatible.

Additionally, another method to delete a container along with its objects is also provided (`$container->deleteWithObjects($secondsToWait = null)`). This method takes an optional timeout in seconds during which the above algorithm must complete. If this timeout is not specified, it is estimated based on the number of objects in the container.


SGTM. Changing.