Remove recursive merging in Expr::addManyToSet()

The recursive merging in addManyToSet() dates back to: doctrine/mongodb-odm@59a2da0bf7a53075f9d93b9b1327abccf561c1d1. This could be problematic if addManyToSet() was called multiple times with deep array values, as they could be merged together in PHP. The new behavior will just overwrite the existing value in $newObj, like other update operators.
Implement Expr::each() and allow it to be used with addToSet()
Deprecate Expr::addManyToSet() in favor of addToSet() and each()
Support $each/$slice/$sort operators with push()

MongoDB 2.4 deprecates the $pushAll operator in favor of $push with $each. Additionally, it adds support for $slice and $sort (only in combination with $each).
Expr::push() should ensure $each operator appears first

If the $each operator does not appear first, the $push argument will be considered a single value to append to the array field.
Test array/Expr arguments for logical operators and elemMatch
Use casting and array type-hinting for method args

This changes the public API for in/notIn and removes the array cast in notIn (behavior change); however, the methods are now consistent.

Other methods that take a single scalar type can use casting to sanitize their input.