The old interface only allowed one to perform terminal detection on a
handle and change it to UTF-8 if it was not a terminal. Turns our, it
makes sense to sometimes leave the original encoding on a handle even if
it does not point to a terminal.
* Change the interface to separate these two use-cases.
* Extract main-wrappers to a new `Main` module.
Previously the code was using stdout for testing the terminal detection
functionality. However, there is no guarantee that the tests will always
be running with stdout attached to a terminal.
Create a fresh pseudo-terminal instead and use it instead of stdout.
* Split out the actual encoding choice logic into a separate Internal
module to make it possible to cover it with tests.
* Make this function a little more efficient compared to the previous
purely pure function.
* Keep a completely pure function as a specficiation for ease of reading
and for testing by comparing the actualy function to the pure one.
* Add tests that check that the pure function makes sense.
* Add tests that compare the output of the real function to the output
of the pure function on some real handles.
* Add tests that check that functions that are supposed to actually
modify the encoding of a handle actually do modify it.