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> },
        // ...
    ]
}
```
Is _currentIndex actually a WriteResult::BulkId? If so, drop the forward decl and pull in write_result.h so that you can use it. Should be fine bc. users of BulkOperationBuilder can't really use it without knowing about WriteResult, so I don't mind the direct inclusion.