RIDBag class

Adds a new class to represent [RIDBags](https://github.com/orientechnologies/orientdb/wiki/RidBag) which are used to contain lists of RecordIDs, especially when querying edges. 

The previous behaviour, before the new deserializer was added, was to immediately decode a bag into a list of record id instances as soon as it was encountered in a record. The new behaviour instantiates a RIDBag class but all parsing operations are performed lazily, so by default it won't even base64 decode the bag until it's actually required. And if you only ask for the first few RIDs in a bag, only those will be decoded. This is much faster and more efficient for cases where a bag is returned and not fully used,

This PR also adds *preliminary* support for tree based RIDBags, which occur when the bag reaches a certain size (by default at least 80 records). When a tree bag is returned, it's up to the client to perform operations on the remote tree, so no actual RID data is returned directly. To be honest this kind of sucks from our point of view, since it's not possible to implement a consistent API between Embedded bags and Tree bags because one is sync and the other is async. Open to ideas on how to deal with this. We also need to add support for the tree based bag related operations, e.g. `REQUEST_SBTREE_BONSAI_GET`, `REQUEST_SBTREE_BONSAI_FIRST_KEY`, `REQUEST_SBTREE_BONSAI_GET_ENTRIES_MAJOR` etc. We'll address this when we figure out this API problem.