Use System.nanoTime()

This is required to make code resilient to system clock adjustments.
Also it makes timeouts more precise.