significant refactoring

- simplified protocol class
-- Protocols must now only implement 2 methods: send and recv
-- forward_inbound and forward_outbound condensed to just forward
-- moved direction constant definitions to /core.py
-- protocols block after receives more cleanly
- simplified GUI
-- PyxieGui now implements the PyxieBaseListener interface
-- PyxieGui directly calls protocols' send() when it is ready
- various other polishing