Ensure that arguments to elapsed and diff are in timestamp form

Previously you could send floating point arguments. Because of how
the arguments were being matched on, diff was calling itself in an infinite
loop. This commit makes sure that the arguments are in the form that the docs
specify they should be. It also adds some tests to verify the functions are working
correctly.