This getElapsed() behavior doesn't seem consistent with stop() above.

If after a checkpoint occurs running is still true, then getElapsedTimeNano could return wildly inaccurate numbers. Stop seems to just ignore adding the detected inaccurate elapsed time. Since we at the Broad don't have good checkpointed systems to try this out on, what should we start with for both stop() and getElapsedTimeNano()? I'm fine if they both behave as if something strange happened and ignore the time discrepancy.

How often does one expect these events? For infrequent checkpointing, I would like to see a message printed though via Logger.warn() so that someone watching the progress can know that something unexpected happened.