Kjr/rework callbacks

Opening this pull request to start a conversation about how callbacks should work. Current implementation seems a bit ad-hoc.