NaN parameters now throw synchronous errors

@jdimond - please review and merge. NaN inputs used to throw asynchronous errors because we let them through and tried to write them to Firebase. Firebase would reject them and cause the promises to fail. However, these errors are easily missed if you don't have a `catch()` on your promise. If we throw errors synchronously, there is no way they will miss the error.

Fixes issue #31.