notifications abstraction, first pass

@SachaG There is a lot more I want to do with this but here is what I am thinking. I have not touched the client but for now I don't know if thats even necessary. This works for me locally but since you don't have tests yet I am not sure if I broke anything.