Add two new cross-platform methods to PathUtilities

- PathUtilities.OpenDirectoryInExplorer opens the directory in
  Explorer or the default file manager.
- PathUtilities.OpenFileInApplication opens a file in the default
  application (like double clicking on the file in explorer).

Change-Id: I199897ca5fe2c3fb78b13a7f71a5e21c7ca36457
Fix bug on Windows side of SelectFileInExplorer

Windows wants a comma after the /select parameter in order to really
select the file.

Change-Id: I5206be221316da1e399dbe92a38a630ab826a83f
Make USB drive access more robust

This includes a couple of minor fixes to mitigate random crashes seen
in testing WeSay Send/Receive via USB drives.
Merge pull request #108 from sillsdev/MakeUsbAccessMoreRobust

Make USB drive access more robust
Reverse accidental(?) disabling of check before saving metadata

Fix a problem caught in code review. Suspect this change was made just for debugging
and checked in by mistake.
Refactor assertion checking of StampAssemblyTests

Doing it this way displays the expected and actual text if a test fails,
making it easier to see what's wrong.
Enhance assembly stamping

- support AssemblyInformationalVersion
- allow to use hash code in AssemblyInformationalVersion. This works
  since that is treated as a string by the framework.
- some refactorings

Change-Id: I939b1f12234c313cd6e3db3f555dafad48a9f843
Fix whitespace issues

Change-Id: Ib40b2b4c20d492acf7cd7c5a2592a964ff1fb873
Improve error reporting class visibility

Make some classes internal where there is no need that the client
uses them. This makes it a little easier to understand what needs
to be done in order to use the reporting classes.

Change-Id: I7215ae17d66c584e8485fd311e8de5add9f9300c
Small performance improvement

Doing the cast once is more efficient than doing it three times.

Change-Id: I6e986f5964dad59499dcc20f336c4ee3fceb6b20
Make Logger and UsageReport more thread safe

Change-Id: Idd0b8fc503daf7df1d678a1e1674cd61f96463e7
Make exception reporting more thread safe

When an exception occurs on a background thread ideally it should
be handled by the application. However, not all applications are
always implemented to do it that way, so we need a safe fall back
that doesn't pop up a dialog from a (non-UI) background thread.

This implementation creates a control on the UI thread in order to
be able to check if invoke is required. When an exception occurs on
a background thread we push the exception data to an exception data
stack and try to invoke the exception dialog on the UI thread. In
case that the UI thread already shows an exception dialog we skip
the exception (similar to the behavior we already have when we get
an exception on the UI thread while displaying the exception
dialog). Otherwise we display the exception dialog, appending the
messages from the exception data stack.

Change-Id: I20ae5cb4e84a3ba4baf81fae7366f22c8c83e0a8
Merge pull request #106 from ermshiperete/MorePathUtilties

Add two new cross-platform methods to PathUtilities
Merge pull request #98 from ermshiperete/feature/EnhanceStamping

 Enhance assembly stamping
Merge pull request #93 from ermshiperete/ImproveReporting

Improve reporting
Fix LIFT parser to handle empty ranges in external file
Merge pull request #109 from sillsdev/Fix-External-Lift-Ranges-Parsing

Fix LIFT parser to handle empty ranges in external file
Fix keyboard control to call the proper setup program on Linux

The fix isn't foolproof across the range of possible Linux
variants, but is better than before.
Merge pull request #110 from sillsdev/Fix-WS-172

Fix keyboard control to call the proper setup program on Linux