Legacy batches should validate and normalize add() arguments

Remove extra object casting from Bulk code, since command (internal to driver) and legacy batch classes will process the operations on their own.

Casting to objects to ensure proper BSON serialization was good in theory, but the driver converts fields such as "q" and "u" in an update operation to an array, which defeats the purpose. We do not need object casting for legacy methods, since those fields become direct arguments to MongoCollection write methods.

Normalization of arguments in the legacy add() methods is now consistent with the driver's own MongoWriteBatch::add() behavior; however, the legacy method will throw an exception if the argument is not an array or object instead of triggering a PHP error.
Refactor LegacyWriteBatch::execute() to avoid code duplication

Created executeSingleOperation() method within child classes. This will keep execute() readable once try/catch blocks are added later (around MongoCollection write methods).