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> },
        // ...
    ]
}
```
The clarity of this was hopefully addressed in my previous changes/comment. Check it out and let me know what you think.

The spec doesn't specify which error to throw at the end of processing an Un-ordered batch so it's up to us. In the ordered case front()/back() would be equivalent so we throw immediately. I think you are right though and throwing back is better as it is the most recent so we'll change it to back.