code: @InterfaceStability.Experimental
      @InterfaceAudience.Public
      public Single<JsonDocument> getFirstPrimaryOrReplica(final String id,
          final Bucket bucket, final long primaryTimeout, final long replicaTimeout) {
          return getFirstPrimaryOrReplica(id, JsonDocument.class, bucket, primaryTimeout, replicaTimeout);
      }
docs: Asynchronously fetch the document from the primary and if that operations fails try
  all the replicas and return the first document that comes back from them (with custom
  primary and replica timeout values).
  
  @param id the document ID to fetch.
  @param bucket the bucket to use when fetching the doc.
  @param primaryTimeout the timeout to use in MS when fetching the primary.
  @param replicaTimeout the timeout to use in MS when subsequently fetching the replicas and primary.
  @return an {@link Single} with either 0 or 1 {@link JsonDocument}.