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> },
        // ...
    ]
}
```
I've renamed the second parameter of `_checkResult()` to be `throwOnError` so it's clearer.

The spec overloads an unordered bulk operation to mean "continueOnError" so we use this variable to determine whether processing should continue in the event of an error or throw immediately. If we have continued to process in the face of writeErrors for an unordered batch we need to throw the exceptions we received at the end so we force throwOnError to be true and check one last time.

That being said, we can use a ternary to check if we are on the last batch so I've removed the last check and replaced the other with:

```cpp
// Check if we need to raise an error, always throw if errors and on last op.
_checkResult(wr, *batch_iter == write_operations.back() ? true : ordered);
```