Refactor Exile.Process API and corner cases
This is mostly complete rewrite with the focus on the how the process
gen-server state-machine behave when reader and writer run
concurrently. While it already supported that previously, but the API
surface was large (such as support for concurrent await_exit, multiple
writer etc). and there were some corner cases such as handling of
EPIPE. With the new rewrite the Process server now offloads the
pooling and concurrent read/write to user.
This is a breaking change for Exile.Process. It was already
mentioned as unstable and user should always use Exile.stream!.
Users using Exile.stream! should be unaffected by the change, unless
if they are depending on the corner error cases