Fix implementation of ISO 8601 date/time:
* When writing time zone, use "Z" for UTC, drop minutes when they are
zero, and otherwise insert ":" between hours and minutes. Omitting
the ":", as was previously done, is not compliant.
* When parsing, there are two formats: basic and extended. With basic
format, there are no "-" or ":" separators allowed, and with
extended format, they are all required. Previously the parser
allowed each of the date, time, and zone to independently be in
either format. Now the parser requires all three to be in the same
format.
* The parser now handles fractional seconds correctly, rounding up if
the fraction is >= 1/2. It is also careful to use exact arithmetic
for fractions.
* The parser now additionally accepts "," as a fraction indicator, as
required by the standard.
* The parser now implements fractional hours and fractional minutes.
* The parser now accepts time zones over the full range of +/-24
hours; previously it was restricted to +/-12 hours (except the
minute could be non-zero at +12 or -12, which made no sense).
* The parser now computes time zones with non-zero minutes correctly:
old formula: (+ (* SIGN HOUR) (/ MINUTE 60))
new formula: (* SIGN (+ HOUR (/ MINUTE 60)))
* The parser has two kluges to accomodate incorrectly-formed strings
that were once generated by this code: (1) the space character can
be used in place of "T" as a date/time separator; and (2) the ":"
may be omitted from the time zone in extended format.