PHP-990: MongoWriteBatch API

Userland API:

```
<?php
abstract class MongoWriteBatch {
    const OP_INSERT = 0;
    const OP_UPDATE = 1;
    const OP_DELETE = 2;
    private $collection;
    private $op;
 
 
    protected function __construct(MongoCollection $collection, enum $op) {
        $this->collection = $collection;
        if (!in_array($op, array(0, 1, 2))) {
            throw MongoException();
        }
        $this->op = $op;
        _internal_initialize_{$this->writeop}();
    }
 
    /* bool */ function add(array $item) {
        if (!_internal_check_missing_keys($item, $this->op)) {
            throw MongoException("Missing key 'x'");
        }
        _internal_add_item($item);
    }
 
    final /* array */ function execute(array $writeConcern) {
        _internal_execute($writeConcern);
        return _internal_read_server_response();
    }
}
 
 
class MongoInsertBatch extends MongoWriteBatch {
    function __construct($collection) {
        parent::__construct($collection, self::OP_INSERT);
    }
}
 
class MongoUpdateBatch extends MongoWriteBatch {
    function __construct($collection) {
        parent::__construct($collection, self::OP_UPDATE);
    }
}
 
class MongoDeleteBatch extends MongoWriteBatch {
    function __construct($collection) {
        parent::__construct($collection, self::OP_DELETE);
    }
}
```