CXX-237 Add support for merging bulk write results

The CXX-175 ticket (Pull request #79) added bulk write capabilities but this completes the requirements for the [Bulk Write API spec](https://github.com/10gen/specifications/blob/master/source/driver-bulk-update.rst) by adding support for the merging of write results.

Previously, processing of write operations via a `DBClientWriter` simply returned a `std::vector<BSONObj>` representing the results of processing multiple writes. These changes make it so execution of writes return a `WriteResult` instead.

WriteResults have various methods that provide information about successful write operations as well as write errors which not only help the user determine what happened if an error occurs but also help `DBClientWriter`s determine when to throw an `OperationException`.

The spirit of the `WriteResult` class can be inferred from the following JavaScript object representation:

```js
{
    "nInserted" : 0,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 1,
    "upserted" : [
        { index: <index>, _id: <id> },
        { index: <index>, _id: <id> }
        // ...
    ],
    "writeErrors" : [
        { index: <index>, code: <code>, errmsg: "errmsg", op: <op> ... },
        { index: <index>, code: <code>, errmsg: "errmsg", op: <op> ... },
        // ...
    ],
    "writeConcernErrors" : [ 
        { code: <code>, errmsg: "errmsg", details: <errInfo> },
        { code: <code>, errmsg: "errmsg", details: <errInfo> },
        // ...
    ]
}
```
If the field is not present getIntField() returns `std::numeric_limits< int >::min()` so we can check if it's less than zero.