context: make Deadline toString() more readable

diff --git a/context/src/main/java/io/grpc/Deadline.java b/context/src/main/java/io/grpc/Deadline.java
index 1152ee3..dc091e6 100644
--- a/context/src/main/java/io/grpc/Deadline.java
+++ b/context/src/main/java/io/grpc/Deadline.java
@@ -36,6 +36,7 @@
   // to prevent wraparound as long as process runs for less than ~100 years.
   private static final long MAX_OFFSET = TimeUnit.DAYS.toNanos(100 * 365);
   private static final long MIN_OFFSET = -MAX_OFFSET;
+  private static final long NANOS_PER_SECOND = TimeUnit.SECONDS.toNanos(1);
 
   /**
    * Create a deadline that will expire at the specified offset from the current system clock.
@@ -89,6 +90,7 @@
    * Is {@code this} deadline before another.
    */
   public boolean isBefore(Deadline other) {
+    assert this.ticker == other.ticker : "Tickers don't match";
     return this.deadlineNanos - other.deadlineNanos < 0;
   }
 
@@ -97,6 +99,7 @@
    * @param other deadline to compare with {@code this}.
    */
   public Deadline minimum(Deadline other) {
+    assert this.ticker == other.ticker : "Tickers don't match";
     return isBefore(other) ? this : other;
   }
 
@@ -142,11 +145,25 @@
 
   @Override
   public String toString() {
-    return timeRemaining(TimeUnit.NANOSECONDS) + " ns from now";
+    long remainingNanos = timeRemaining(TimeUnit.NANOSECONDS);
+    long seconds = Math.abs(remainingNanos) / NANOS_PER_SECOND;
+    long nanos = Math.abs(remainingNanos) % NANOS_PER_SECOND;
+
+    StringBuilder buf = new StringBuilder();
+    if (remainingNanos < 0) {
+      buf.append('-');
+    }
+    buf.append(seconds);
+    if (nanos > 0) {
+      buf.append(String.format(".%09d", nanos));
+    }
+    buf.append("s from now");
+    return buf.toString();
   }
 
   @Override
   public int compareTo(Deadline that) {
+    assert this.ticker == that.ticker : "Tickers don't match";
     long diff = this.deadlineNanos - that.deadlineNanos;
     if (diff < 0) {
       return -1;
diff --git a/context/src/test/java/io/grpc/DeadlineTest.java b/context/src/test/java/io/grpc/DeadlineTest.java
index 548ebe5..1c98ac5 100644
--- a/context/src/test/java/io/grpc/DeadlineTest.java
+++ b/context/src/test/java/io/grpc/DeadlineTest.java
@@ -211,13 +211,25 @@
   @Test
   public void toString_exact() {
     Deadline d = Deadline.after(0, TimeUnit.MILLISECONDS, ticker);
-    assertEquals("0 ns from now", d.toString());
+    assertEquals("0s from now", d.toString());
   }
 
   @Test
   public void toString_after() {
-    Deadline d = Deadline.after(-1, TimeUnit.MINUTES, ticker);
-    assertEquals("-60000000000 ns from now", d.toString());
+    Deadline d;
+
+    d = Deadline.after(-1, TimeUnit.MINUTES, ticker);
+    assertEquals("-60s from now", d.toString());
+    d = Deadline.after(-1, TimeUnit.MILLISECONDS, ticker);
+    assertEquals("-0.001000000s from now", d.toString());
+    d = Deadline.after(-500, TimeUnit.MILLISECONDS, ticker);
+    assertEquals("-0.500000000s from now", d.toString());
+    d = Deadline.after(-1000, TimeUnit.MILLISECONDS, ticker);
+    assertEquals("-1s from now", d.toString());
+    d = Deadline.after(-1500, TimeUnit.MILLISECONDS, ticker);
+    assertEquals("-1.500000000s from now", d.toString());
+    d = Deadline.after(-1023456789, TimeUnit.NANOSECONDS, ticker);
+    assertEquals("-1.023456789s from now", d.toString());
   }
 
   @Test
@@ -246,7 +258,7 @@
   @Test
   public void toString_before() {
     Deadline d = Deadline.after(12, TimeUnit.MICROSECONDS, ticker);
-    assertEquals("12000 ns from now", d.toString());
+    assertEquals("0.000012000s from now", d.toString());
   }
 
   private static class FakeTicker extends Deadline.Ticker {
diff --git a/core/src/test/java/io/grpc/CallOptionsTest.java b/core/src/test/java/io/grpc/CallOptionsTest.java
index 7b31148..2a54e40 100644
--- a/core/src/test/java/io/grpc/CallOptionsTest.java
+++ b/core/src/test/java/io/grpc/CallOptionsTest.java
@@ -168,7 +168,7 @@
 
   @Test
   public void toStringMatches_withDeadline() {
-    assertThat(allSet.toString()).contains("1 ns from now");
+    assertThat(allSet.toString()).contains("0.000000001s from now");
   }
 
   @Test