new Formatter.General(-1) throws exception

Most formatters would fail when given strange precision because `Number.toFixed` throws an error. But `Formatter.General` doesn't use `toFixed`, so it failed silently.

Now all formatters throw an exception on construction if their precision is strange.

Close #568.
minor quibble, but i think this is more readable as either `(precision < 0 || precision > 20)` or `(0 < precision || precision < 20)`