The readIO function is similar to read except that it
signals parse failure to the IO monad instead of terminating
the program.
This operation may fail with:
Read the value of an IORef.
Beware that the CPU executing a thread can reorder reads or writes to
independent locations. See Data.IORef#memmodel for more
details.