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.
You cannot do this in two `pick()` calls, since the `discoveryClient.discover` returns a live iterable, meaning two calls may give you two different results. The first call to `pick()` returns non-null doesn't mean it will be non-null when you call it again. So you have to do it like:

```java
Discoverable discoverable = endpointStrategy.pick();
if (discoverable != null) {
  return discoverable.getSocketAddress();
}
throw new NotificationFeedException(...);
```