Notifications System core

Following https://issues.cask.co/browse/CDAP-849 jira and design doc.
Build is running at https://builds.cask.co/browse/CDAP-DUT320-3.
Usually I won't call user method (or a method on an executor provided the user) while holding a lock, as this creates the possibility of deadlock. Better submit the task to an internal executor (you want ordering as well) and call user method from there (hence holding no lock).