Add reference counting to keep native UObject(s) referenced in C# alive

Whenever a native UObject instance is returned to managed code its
reference count is incremented, and when a managed UObjectHandle that
references a native UObject is disposed the reference count is
decremented. Once the reference count for a UObject reaches zero the
engine is free to garbage collect it.

Reference counting is not currently used for UClass instances passed to
managed code, under the assumption that the engine will not garbage
collect UClass instances. This assumption is not based on fact, just
wishful thinking, so this may change when I have time to investigate.