Improved browser detection, including detecting mobile browsers

The current way of detecting browsers and versions was simply unsupportable. We ran out of bits. I separated out the browser name detection from the browser version number detection.

Generally, we shouldn't be doing browser detection to determine features. However, users don't know about features, they only know about browsers and version numbers. So, if we need to detect whether a particular browser is supported by our application, we can do it now, and it should last into the foreseeable future.

Also adds detection for a mobile browser, in case you want to serve up a different set of pages for mobile browsers.