V2

@alexeyvo , the way this is implemented goes against the principle to focus on performance. 
I see you use toMongoCBson() in all functions that require a bson to be passed to the API, so we are effectively making a full copy of the source object.
The idea is to avoid copying the object but accessing the internal handle of the IBson and passing that to the underlying function as long as the underlying function in the C library doesn't attempt to take ownership of the object.
Even in that case, IBson could provide a mechanism to release the underlying bson object to prevent a copy, rendering the IBson unusable, but that's OK, sometimes you want to do that.
Remember in Delphi world IBson is just a wrapper for the underlying object, a fancy way to manipulate the C bson object