Added Pool for WorkQueue WorkItems

This is an optional construct to allow the user to create their own pools or not use the pool if they so desire.

Below is the profiling for the Octree and View changes to pooled allocation.

Before:
>UpdateDrawables                        35    0.139    0.193    0.135     4.871
>SortAndUpdateGeometry          35    0.080    0.135    0.077     2.802

After:
>UpdateDrawables                        21    0.082    0.172    0.078     1.735
>SortAndUpdateGeometry          21    0.054    0.069    0.052     1.144

To use the pooled allocation it works like so:

```C++
SharedPtr<WorkItem> item = WorkQueue::GetFreeItem();
// Set Item Variables.
WorkQueue::AddWorkItem(item);
```