deep refactor of the code
- more code moved to the lib, cleaner main.ml file
- more abstractions, less indirection
- updated the editor for reusability and robustness
- removed lwt, since we don't really have true async code
- use bos for command running and stdin/stdout/stderr handling