function createDualNullVersion(s3, bucketName, keyName, cb) {
    async.waterfall([
        // put null version
        next => s3.putObject({ Bucket: bucketName, Key: keyName },
            err => next(err)),
        next => enableVersioning(bucketName, err => next(err)),
        // should store null version as separate version before
        // putting new version
        next => s3.putObject({ Bucket: bucketName, Key: keyName },
            (err, data) => {
                assert.strictEqual(err, null,
                    'Unexpected err putting new version');
                assert(data.VersionId);
                next(null, data.VersionId);
            }),
        // delete version we just created, master version should be updated
        // with value of next most recent version: null version previously put
        (versionId, next) => s3.deleteObject({
            Bucket: bucketName,
            Key: keyName,
            VersionId: versionId,
        }, err => next(err)),
        // getting object should return null version now
        next => s3.getObject({ Bucket: bucketName, Key: keyName },
            (err, data) => {
                assert.strictEqual(err, null,
                    'Unexpected err getting latest version');
                assert.strictEqual(data.VersionId, 'null');
                next();
            }),
    ], err => cb(err));
}
createDualNullVersion

- PREVIOUSLY: created a null version that was stored in metadata
  both in the master version and a separate version

- CURRENTLY: only one null version key is present in metadata
  after the second put, as the first null key is cleaned up

 Even though there is only one key at the end, it is still useful
 to keep this function for regression testing

 @param {AWS.S3} s3 - aws sdk s3 instance
 @param {string} bucketName - name of bucket in versioning suspended state
 @param {string} keyName - name of key
 @param {callback} cb - callback
 @return {undefined} - and call callback