issue #1804: Printer object, User Preference Print Settings

This is built on top of @gpazo's https://github.com/xtuple/xtuple/pull/1797 

UAT:
1. Navigate to Billing > Invoices 
2. Print an Invoice and verify that it prints to a new tab on the browser

To setup and print to a printer:
1. Install CUPS and CUPS-PDF
2. Add the Printer to the Printer object in Setup > Printers. Use the EXACT name as the CUPS printer name
3. Navigate home then Actions > Preferences. Set Invoice to the CUPS installed printer.
4. Re-print Invoice, verify that it prints to the selected printer
I think we'll revisit this anyway. Let's say that we want to support another client, maybe a native mobile app. In the long run I *do* think the logic to route the report to the correct printer will live on the server. If we think in terms of REST endpoints, a user should just be able to say, "I'm Steve and I want to print invoice 60012". 

Possibly the technical solution in here to the problem that sometimes you have to open up a new tab and sometimes not is that you can make the call, initially ignorant of that decision, and the server will send back the appropriate instructions, like (1) pop open a new tab with this pdf payload, or (2) look at the printer on your belt and something is coming out of it now.

Like I've said, we don't have to implement this on this PR.