Refactor WorkItem to use a SharedPtr implementation

WorkItems now take in a SharedPtr to allow tracking and usage of the complete volatile boolean, e.g:

```c++
                SharedPtr<WorkItem> item(new WorkItem());
                item->workFunction_ = UpdateDrawableGeometriesWork;
                item->aux_ = const_cast<FrameInfo*>(&frame_);
                item->start_ = &(*start);
                item->end_ = &(*end);
                queue->AddWorkItem(item);
```