Use normal control flow for invalid IO rather than exceptions; add error messages telling user why their input was invalid