This implementation of a validator (storing a pointer to EngineBuffer) is an example of how it will become tricky to write validators. The validator has no control over what thread it runs in -- it runs in the thread of whoever called CO::set() or COT::set(). So this means that code should be either pure code (not depending on any state) or thread-safe code. 

This method on EngineBuffer is thread safe since that method only touches m_iTrackLoading (a QAtomicInt) and m_pCurrentTrack (a pointer) and m_playButton (a CO) but in engine-control-refactor I'm trying to separate other threads from the engine code entirely. 

I think the play button isn't the best example for where a validator is needed because really what this validator is encoding is whether or not the button is "enabled". I think we need to add an enabled/disabled state to controls and then EngineBuffer would just set the control as enabled when a track is loading / loaded.