Split frontend and backend

* Frontend code is in the urChatBasic.frontend package
* Backend code is in the urChatBasic.backend package
* urChatBasic.base is the "communication" layer between the two. This should be the only piece that is expected to stay constant at any time, and the front and backends only have to implement the relevant interfaces in the base package.

This allows the program to be more modular. We can completely replace the frontend, and as long as you implement the few interfaces that are needed, you are good. You can completely replace the backend, and as long as you implement the needed interfaces, you are good.