[COREVM-83] Implement dynamic object storage container

Currently `dynamic_object_heap` uses `std::unordered_map` as the underlying storage container for dynamic objects. However, this has two issues: 1. Inefficiency, and 2. "Holes" left in ID range.

The solution to those is to design and implement a new storage container for dynamic objects. This container should uses the allocator type for dynamic objects, and access the objects created directly on the allocator. It should also provide the iterator interfaces for the outside world to access the objects.