Revert "Revert "Declare that animation-instance wants artboard-instance""

This reverts commit d398a90af7907f38d412c5ee060466c0f66bfb85.
diff --git a/include/rive/animation/blend_state_instance.hpp b/include/rive/animation/blend_state_instance.hpp
index 9b1a120..38c5083 100644
--- a/include/rive/animation/blend_state_instance.hpp
+++ b/include/rive/animation/blend_state_instance.hpp
@@ -23,7 +23,7 @@
         const T* blendAnimation() const { return m_BlendAnimation; }
         const LinearAnimationInstance* animationInstance() const { return &m_AnimationInstance; }
 
-        BlendStateAnimationInstance(const T* blendAnimation, Artboard* instance) :
+        BlendStateAnimationInstance(const T* blendAnimation, ArtboardInstance* instance) :
             m_BlendAnimation(blendAnimation),
             m_AnimationInstance(blendAnimation->animation(), instance)
         {}
diff --git a/include/rive/animation/linear_animation_instance.hpp b/include/rive/animation/linear_animation_instance.hpp
index d03b8db..dcbdc67 100644
--- a/include/rive/animation/linear_animation_instance.hpp
+++ b/include/rive/animation/linear_animation_instance.hpp
@@ -8,7 +8,7 @@
     class LinearAnimationInstance {
     private:
         const LinearAnimation* m_Animation = nullptr;
-        Artboard* m_ArtboardInstance;
+        ArtboardInstance* m_ArtboardInstance;
         float m_Time;
         float m_TotalTime;
         float m_LastTotalTime;
@@ -18,7 +18,7 @@
         int m_LoopValue = -1;
 
     public:
-        LinearAnimationInstance(const LinearAnimation*, Artboard* instance);
+        LinearAnimationInstance(const LinearAnimation*, ArtboardInstance* instance);
 
         // Advance the animation by the specified time. Returns true if the
         // animation will continue to animate after this advance.
diff --git a/include/rive/animation/nested_linear_animation.hpp b/include/rive/animation/nested_linear_animation.hpp
index 7940c51..e96df87 100644
--- a/include/rive/animation/nested_linear_animation.hpp
+++ b/include/rive/animation/nested_linear_animation.hpp
@@ -6,12 +6,13 @@
     class LinearAnimationInstance;
     class NestedLinearAnimation : public NestedLinearAnimationBase {
     protected:
-        LinearAnimationInstance* m_AnimationInstance = nullptr;
+        std::unique_ptr<LinearAnimationInstance> m_AnimationInstance;
 
     public:
-        ~NestedLinearAnimation();
+        NestedLinearAnimation();
+        ~NestedLinearAnimation() override;
 
-        void initializeAnimation(Artboard* artboard) override;
+        void initializeAnimation(ArtboardInstance*) override;
     };
 } // namespace rive
 
diff --git a/include/rive/animation/nested_remap_animation.hpp b/include/rive/animation/nested_remap_animation.hpp
index 9303572..f71c229 100644
--- a/include/rive/animation/nested_remap_animation.hpp
+++ b/include/rive/animation/nested_remap_animation.hpp
@@ -7,7 +7,7 @@
     public:
         void timeChanged() override;
         void advance(float elapsedSeconds) override;
-        void initializeAnimation(Artboard* artboard) override;
+        void initializeAnimation(ArtboardInstance*) override;
     };
 } // namespace rive
 
diff --git a/include/rive/animation/nested_state_machine.hpp b/include/rive/animation/nested_state_machine.hpp
index d96c07b..aa30f02 100644
--- a/include/rive/animation/nested_state_machine.hpp
+++ b/include/rive/animation/nested_state_machine.hpp
@@ -3,10 +3,12 @@
 #include "rive/generated/animation/nested_state_machine_base.hpp"
 #include <stdio.h>
 namespace rive {
+    class ArtboardInstance;
+
     class NestedStateMachine : public NestedStateMachineBase {
     public:
         void advance(float elapsedSeconds) override;
-        void initializeAnimation(Artboard* artboard) override;
+        void initializeAnimation(ArtboardInstance*) override;
     };
 } // namespace rive
 
diff --git a/include/rive/nested_animation.hpp b/include/rive/nested_animation.hpp
index bbc0a87..1f4491b 100644
--- a/include/rive/nested_animation.hpp
+++ b/include/rive/nested_animation.hpp
@@ -3,6 +3,8 @@
 #include "rive/generated/nested_animation_base.hpp"
 #include <stdio.h>
 namespace rive {
+    class ArtboardInstance;
+
     class NestedAnimation : public NestedAnimationBase {
     public:
         StatusCode onAddedDirty(CoreContext* context) override;
@@ -12,7 +14,7 @@
 
         // Initialize the animation (make instances as necessary) from the
         // source artboard.
-        virtual void initializeAnimation(Artboard* artboard) = 0;
+        virtual void initializeAnimation(ArtboardInstance*) = 0;
     };
 } // namespace rive
 
diff --git a/src/animation/linear_animation_instance.cpp b/src/animation/linear_animation_instance.cpp
index 4e6e987..1c8badb 100644
--- a/src/animation/linear_animation_instance.cpp
+++ b/src/animation/linear_animation_instance.cpp
@@ -6,7 +6,7 @@
 using namespace rive;
 
 LinearAnimationInstance::LinearAnimationInstance(const LinearAnimation* animation,
-                                                 Artboard* instance) :
+                                                 ArtboardInstance* instance) :
     m_Animation(animation),
     m_ArtboardInstance(instance),
     m_Time(animation->enableWorkArea() ? (float)animation->workStart() / animation->fps() : 0),
diff --git a/src/animation/nested_linear_animation.cpp b/src/animation/nested_linear_animation.cpp
index 2d418d1..e425c4f 100644
--- a/src/animation/nested_linear_animation.cpp
+++ b/src/animation/nested_linear_animation.cpp
@@ -3,9 +3,10 @@
 
 using namespace rive;
 
-NestedLinearAnimation::~NestedLinearAnimation() { delete m_AnimationInstance; }
+NestedLinearAnimation::NestedLinearAnimation() {}
+NestedLinearAnimation::~NestedLinearAnimation() {}
 
-void NestedLinearAnimation::initializeAnimation(Artboard* artboard) {
-    assert(m_AnimationInstance == nullptr);
-    m_AnimationInstance = new LinearAnimationInstance(artboard->animation(animationId()), artboard);
+void NestedLinearAnimation::initializeAnimation(ArtboardInstance* artboard) {
+    m_AnimationInstance = std::make_unique<LinearAnimationInstance>(artboard->animation(animationId()),
+                                                                    artboard);
 }
\ No newline at end of file
diff --git a/src/animation/nested_remap_animation.cpp b/src/animation/nested_remap_animation.cpp
index fd146eb..2af1522 100644
--- a/src/animation/nested_remap_animation.cpp
+++ b/src/animation/nested_remap_animation.cpp
@@ -10,7 +10,7 @@
     }
 }
 
-void NestedRemapAnimation::initializeAnimation(Artboard* artboard) {
+void NestedRemapAnimation::initializeAnimation(ArtboardInstance* artboard) {
     Super::initializeAnimation(artboard);
     timeChanged();
 }
diff --git a/src/animation/nested_state_machine.cpp b/src/animation/nested_state_machine.cpp
index 2b3ad7c..139572a 100644
--- a/src/animation/nested_state_machine.cpp
+++ b/src/animation/nested_state_machine.cpp
@@ -4,4 +4,4 @@
 
 void NestedStateMachine::advance(float elapsedSeconds) {}
 
-void NestedStateMachine::initializeAnimation(Artboard* artboard) {}
\ No newline at end of file
+void NestedStateMachine::initializeAnimation(ArtboardInstance*) {}
\ No newline at end of file
diff --git a/src/nested_artboard.cpp b/src/nested_artboard.cpp
index 156a9fd..5eec148 100644
--- a/src/nested_artboard.cpp
+++ b/src/nested_artboard.cpp
@@ -82,9 +82,12 @@
     // does require that we always use an artboard instance (not just the source
     // artboard) when working with nested artboards, but in general this is good
     // practice for any loaded Rive file.
-    if (m_NestedInstance != nullptr) {
+    assert(m_NestedInstance == nullptr || m_NestedInstance->isInstance());
+
+    if (m_NestedInstance != nullptr && m_NestedInstance->isInstance()) {
+        auto abi = static_cast<ArtboardInstance*>(m_NestedInstance);
         for (auto animation : m_NestedAnimations) {
-            animation->initializeAnimation(m_NestedInstance);
+            animation->initializeAnimation(abi);
         }
     }
     return Super::onAddedClean(context);