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.

To use the pooled allocation it works like so:

```C++
SharedPtr<WorkItem> item = WorkQueue::GetFreeItem();
// Set Item Variables.
WorkQueue::AddWorkItem(item);
```