there're 3 scenes when an observer is detached:
1. no event running on it -> we can safely remove it from the list
2. an event is dispatched to it but that thread hasn't run ObserverWrapper::Run yet -> we need to reset wrapper not to run that observer and mark it for finish callback to remove it
3. an event is dispatched to it but the finish callback hasn't run yet -> we need mark it and let finish callback to remove it