Changed API to make it similar to other complex data types (such as LocalizedText, ExpandedNodeId, ...).
Added a special "VectorIterator" because the iterators generated by SWIG doesn't work!
So previously it was not possible to iterate over a VariantVector ("for x in vector: ..." was not possible). With the new custom VectorIterator, this problem is solved.
It's now possible to iterate over all vectors, so we modified the examples.
The code of uaf::Variant has been made more generic (by using macros) to minimize the amount of code needed.

Also, Variants now store native UAF objects for NodeIds, ExpandedNodeIds and QualifiedNames. These particular UAF types (uaf::NodeId, uaf::ExpandedNodeId and uaf::QualifiedName) store the namespace URI in addition to the namespace index. The SDK types on the other hand, only store the latter. This can lead to a loss of information. E.g. when a QualifiedName with a server URI is stored in a VariantVector, previously the server URI information was lost (because the internal UaVariant object wrapped by uaf::Variant is not able to store server URIs). As of now, this information is stored.
The API of DateTime was changed, so we update the code whenever the DateTime::toSdk() method is used.
Variants (and therefore also VariantVectors) now store native UAF types, which can store namespace URI information. Therefore, we can now read/write/... NodeIds and ExpandedNodeIds and QualifiedNames that rely on the namespace URI and server URI (instead of only the namespace index and server index).
Variants now store native uaf NodeIds, ExpandedNodeIds and QualifiedNames (see previous commit). This behavior can now be tested by using this "unittesthelper".