Use dependency-injection with `CLI` and ruby's `Kernel`

This changes the `CLI` to allow passing a "kernel" (dependency
injection). This is used to call the `puts` and `exit` system
calls that the CLI uses. The benefit of this is that in testing,
a "kernel spy" can be easily passed in and then used to test
what system calls were made. Ruby makes it very easy to call
these system calls, but it causes issues when trying to test the
behavior. This handles the testing scenario without the need
for the complicated `test/support/spy` that was previously used.