private DownloadImpl submitDownload(PreparedDownloadContext preparedDownloadContext) {
        Future<File> future = executorService.submit(preparedDownloadContext.getCallable());
        DownloadImpl transfer = preparedDownloadContext.getTransfer();
        transfer.setMonitor(new DownloadMonitor(transfer, future));
        preparedDownloadContext.getLatch().countDown();
        return transfer;
    }
Same as public interface, but adds a state listener so that callers can
be notified of state changes to the download.

@see TransferManager#download(GetObjectRequest, File)
aws-java-sdk-s3/src/main/java/com/amazonaws/services/s3/transfer/TransferManager.java