Driver experimentation. I implemented a simple WebSocket server
in C-sharp. End-goal is to have the browser connect directly
to the driver via javascript and receive device info via push
notifications rather than polling constantly and mucking around
in the filesystem. This is still in proof-of-concept stage.

I added a method to the top-level executable for sending message
to POS. Individual serial port handlers should both send and
receive messages via their parent thread. This separation allows
the communication method to change without disturbing the underlying
device handlers. The default Magellan.cs / pos.exe still writes
messages to POS via files. The NewerMagellan.cs implementation
pushes messages via WebSocket instead. Use "make socket.exe" to
build that one.

I also added a method named javascriptFile to the PHP ScaleDriverWrapper
class. Intention is to switch between polling and push notifications
through configuration changes and not disturb anything else in POS.

This is an extremely important subsystem, obviously, so lots of
testing is required. I think the approach has a lot of merit though.
1. Push notices should be more performant than polling
2. Eliminates permission issues reading & writing output via files
3. Eliminates errors when multiple browser windows or tabs are open.
   In my experience this causes a lot of confusion. Hardware works
   intermittently depending whether the browser the cashier is
   looking is the one that received a particular output.

Main concern at this point is adding & removing clients cleanly.
So far browsers seem to send a proper close notification when leaving
a page with an open WebSocket connection. But unexpected connection
drops need to be handled in a way that doesn't bring down the whole
driver and lets connection(s) re-establish on the next page load.