Improve service discovery API to allow push model for getting endpoint changes.

In the old API, discovery service client returns an Iterable, which forces user to use polling model. This PR includes changes to add change listener so that a push model is possible.

The main change is in the `DiscoveryServiceClient` discover method to return a `ServiceDiscovered`, rather than `Iterable` (the `ServiceDiscovered` extends from `Iterable` so that it's binary compatible). Extra functionalities are provided by the `ServiceDiscovered` interface.