Events Overhaul

Updates event raising to avoid a potential race condition. Also changed
private On* methods to protected virtual to allow for easier
inheritance.