Implemented batch fetching for NSManagedObject uniquing

As discussed in #324, there is a big performance hit when converting a big number of `MTLModel`s to `NSManagedObjects`s, because an individual fetch request is made whenever a unique managed object is expected. 

This PR takes an approach of batching these individual fetch requests into bigger ones. This allows for a great performance improvement (over a magnitude) compared to the current approach. 

First, an additional pass through the model hierarchy is performed before an actual serialization. During this pass, all uniquing key-value pairs are being collected per model class. These values are then used to compile fetch requests. Models are then bound to fetched managed objects, so they can be used during the main serialization pass.

`MTLManagedObjectAdapter` now has two new methods accepting collections, similar to `MTLJSONAdapter`. However, in this case it's not just a mere conveniency, but also a big source of optimization.

I've added some basic tests for this stuff, however I intend to add more for complex cases such as multiple uniquing keys. 

Looking forward to hear from you :)
The purpose is to reduce the number of values being passed to predicate. In theory, we may have duplicates which would have no actual impact on the results, but would increase the time required to perform a fetch. 

The reason why we don't use `NSMutableSet` from the beginning is because it's faster this way too, I believe.