Add a callback based event system
Restructure into a proper project layout