Standardization of discounttype settings
Transaction-ending refactor discussed in #358
New method TransRecord::finalizeTransaction [optionally] adds
tax & discount lines, rotates data out of localtemptrans, and
update session transno value. Ending script ajax-end.php now
takes a "ref" argument specifying a receipt number. Ditto
for ReceiptLib::printReceipt. Lookups are all against localtranstoday.
BUGFIX: missing $CORE_LOCAL ref in CreditCardTender module
Remove legacy broken URL from Steering parser
Added default mapping for PriceMethod modules
BUGFIX: end transaction on 'ddd' receipt type
Dual-screen fixes:
* CSS issues fixed on posCustDisplay so it renders properly
* CustomerDisplay.js rewritten to provide functions for interacting
  with that window
* Main screen (pos2.php) launches customer display window
* Customer screen updates when main screen reloads OR main screen
  is updated via ajax callback
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.
Deal with decimal point on open ring sensibly
Simplified & revised Void. Reverses actual record without re-applying
different group logic.
BUGFIX: merge same items into single line in modular receipt
BUGFIX: incorrect lookup when voiding previous Paycard transaction
boxMsg display needs to avoid double-styling
BUGFIX: don't try to tender out after checking gift card balance
Always include customer display javascript
Whitespace cleanup
Include trans_subtype in modular receipt lookup to filter comment lines
correctly. Rewrite trans_id on member special lines to put them
adjacent to the corresponding item
Always reset on success. Gift + Credit/Debit/EBT interaction still needs work
End transaction before receipt BUGFIXES:
* Malformed ref in ReceiptLib::receiptNumber()
* Only attempt drawer kick on finished transaction
* Always establish a ref# in end script if not provided
* WFC cab coupon needs to provide ref
* Integrated CC reprint needs to provide ref
* WFC kicker needs to query localtranstoday
Added comments to TransRecord::finalizeTransaction()
Generic manager-approved tender module