CDAP-398 Add exists() and waitForX() to cdap-client classes

https://issues.cask.co/browse/CDAP-398
Tried two simple ways of doing this. Since `exists(appId)` (the predicate) throws an exception, it's a bit complicated.

With `Predicate`:
```
try {
      ProgramFlowUtil.waitForPredicate(new Predicate<String>() {
        @Override
        public boolean apply(@Nullable String appId) {
          try {
            return exists(appId);
          } catch (Exception e) {
            throw new RuntimeException(e);
          }
        }
      }, appId, timeout, timeoutUnit);
    } catch (ExecutionException e) {
      // exists(appId) threw an exception
      if (e.getCause() instanceof RuntimeException) {
        RuntimeException runtimeException = (RuntimeException) e.getCause();
        if (runtimeException.getCause() instanceof UnAuthorizedAccessTokenException) {
          throw (UnAuthorizedAccessTokenException) e.getCause();
        }
        if (runtimeException.getCause() instanceof IOException) {
          throw (UnAuthorizedAccessTokenException) e.getCause();
        }
      }
    } catch (TimeoutException e) {
      throw new TimeoutException("Timed out waiting for application '" + appId + "' to be deployed");
    }
```

With `Callable`:
```
    try {
      ProgramFlowUtil.waitForCallable(new Callable<Boolean>() {
        @Override
        public Boolean call() throws Exception {
          return exists(appId);
        }
      }, timeout, timeoutUnit);
    } catch (ExecutionException e) {
      // exists(appId) threw an exception
      if (e.getCause() instanceof UnAuthorizedAccessTokenException) {
        throw (UnAuthorizedAccessTokenException) e.getCause();
      }
      if (e.getCause() instanceof IOException) {
        throw (UnAuthorizedAccessTokenException) e.getCause();
      }
    } catch (TimeoutException e) {
      throw new TimeoutException("Timed out waiting for application '" + appId + "' to be deployed");
    }
```