Update README
Migrate from Browscap to ua-parser. Fixes #187.

Closes #238.
ua-parser: Update History, README. Soft fail in init.php

* Update History, replace Browscap entry since that was never
  released, compared to the previous release we switched from
  the old regexes to ua-parser.

* Update README to mention that the submodule needs to be
  initialised, and the script ran to fetch the yaml file.

* PHP 5.3.1 has a bug that causes problems:
  https://bugs.php.net/bug.php?id=50394
  Require PHP 5.3.2 instead, also update check in init.php and
  remove the redundant check in MaintenanceScript since init.php
  already takes care of it and is always loaded first.

* Add a check in init.php for the presence of ua-parser.
  Otherwise PHP will fail with 500 Internal Server Error when it
  tries to require_once the file.

* HomePage/Swarmstate: Remove the 'default' browserSet which
  is bound to get outdated and obsolete with the new parser.
  Instead of showing the 'default' browser set on the homepage,
  show all (locally) configured browser sets and sort them
  alphabetically and show that instead. That way we won't have
  irrelevant browsers on the homepage, or relevant browsers
  missing from the home page.

* Remove old displaytitle/displayicon properties that were
  sometimes injected into the object. Use browserFull, id
  and swarmClass instead.
  Also get rid of preg_replace( "/\w+ /", .. ) hack,
  using $uaData['version'] instead.
(BREAKING CHANGE) Refactor browserSets to support OS and devices.

* The uaID system doesn't scale well to allow more advanced
  versioning of browsers, os and devices.
  BrowserSets can now define exactly (instead of with hacky
  prefixes) which properties should match what.

  uaIDs are still used for unique string identification in the
  API and database, but they are now freeform.

* Icons are now displayed based on CSS classes.

* Label below the icon is now the full display title (instead of
  just the browser version number), so that OS/device is also
  distinguished (instead of having 3 the same next to each other).
  Also prevents some labels from becoming an empty string as
  Android and iOS are often registered without a browser
  (only device and/or os), in which case there is no browser
  version number to display.

* Fixed incorrect message
  "TestSwarm does not recognise your browser"
  to be more precise. There is practically no browser that isn't
  recognised anymore. This message is now only triggered for
  browsers that are not needed by the swarm (no entry in the
  configuration of that particular swarm, different from one swarm
  to another).

* Added a few different examples in the sample settings to
  show that:
  - the ID is completely free form
  - browser is optional
  - how to do iOS, iPad, Android, Window, Mac, etc.

* Removing old perl script that is no longer compatible.

* The configuration format is a breaking change.
  browserSets is now an object instead of an array. The keys are
  are still unique IDs for the database (which means you shouldn't
  change them, unless you are okay with existing runs submitted
  with that ID becoming non-runnable, just like before).
BrowserInfo: Implement wildcard system.

Sometimes we need to tolerate for inconsistent implementation
details when working with different parties. This is such case.

Opera, for instance, has no patch versions (only major and minor).
Instead they roll with 2 digit minor versions (11.60, 11.62, 12.01 etc.)

This makes it hard to compare against when working with
browserstack, which only exposes the first digit.

So in order to have "browser: .., major: .." find a match between
testswarm and browserstack-api/browsers, we need to allow a
wildcard.

Added example in sample settings.
Remove debug line (tweet tweet d974adaf)
(BREAKING CHANGE) Settings: Separate UA definition from browserSet composition.

This avoids duplication, and fixes the bug where two sets could have
the same ID with a different definition (which blows up the system as
uaIDs are globally unique and can only be defined once).

It also solves the problem of what to do with old definitions that
don't belong to any set anymore, but should still be defined so
that old runs can be re-run.

The answer is: Simply remove them from the browserSets entry, but keep
it in the userAgents index.

This reverts a few line changes from d974ada which change logic
from array_values( $stuff ) to array_keys( (array)$stuff ), since
conf.browserSets is now back to being a numerical array, once again.
Init: Log to error_log for parse error in localSettings.json
BrowserInfo: Implement makeGenericUaData as fallback for unregistered uaIDs.

* Remove unused property 'uaOriginal' from ua-parser/php from
  documentation. We only document the ones we care about.

* Update JobAction::getDataFromRunRows to use makeGenericUaData
  instead of akward Context instantiation for fake user agent '-'.
  d974adaf0 Implemented this by adding a loose public
  Database::getContext method to steal the context, this wasn't
  necessary and incorrect (Context methods should always be final
  and protected).
  Updated to just pass the context directly.
Init: Implement simple 500-error pages for early fatal exits.

* Consistently drop replace=true from header() calls for
  Content-Type (most already don't).
Swarmstate: Only list relevant browsers

If a browser has online clients or pending runs, it is always
relevant (even if it is for jobs from before a browserSet may
have changed to no longer include that ua).

Otherwise we only list it if it is inside a browserSet per the
current configuration in localSettings.

So we're omitting browsers that have no active clients, no pending
runs and are not currently part of any browser set (where jobs may
be submitted for at any time).
Minor clean up in HomePage and ResultPage.

* HomePage: Rephrase "MySwarm needs your help" to "Join MySwarm!".
  It isn't only displayed when there are pending runs in need
  of clients. And this way sounds a little more engaging.
* HomePage: Rename old heading "Browsers" to "State of the Swarm".
  This was previously renamed from section "Desktop browsers" and
  "Mobile browsers".
* HomePage: Display a message when there are no browserSets and
  the swarm is empty.
* ResultPage: Separate uaID from uaRaw in the table, the line
  break looked weird. They are different values, and the html
  table is for key/value pairs, so let's put it in a separate key.
* Fix variable name in Action::newFromContext
* Style: A few single quotes
Swarmstate: Sort by parsed value instead of freeform id.

internal IDs can be in any system the administrator likes (or no
system at all, or maintaining multiple patterns).

This was causing IE 10 (ie_10) to sort after iOS (ios_5), instead of IE 9 (IE9), uppercase before lowercase.
Gotta keep reversing the polarity of the neutron flow..
MaintenanceScript: Add 'required' option and clean up help.
Scripts: Add migrateUaID script.
sync swarm.jquery.org live hacks:

* Fix incorrect "Submodule missing" warning when executing from
  a different directory (e.g. scripts/). In that case it emitted
  a warning even though the inclusion would've gone fine.

* Bump default batch size (I ran it with --batch-size=3500 even).

* Speed up the script when it was interrupted and then ran again.
  In that case we don't want to wait for 1000s of rows that have
  no affectable rows.

* Fix bug where last chunk was forgotten.

* Implement find-unknown and interactive replace-unknown script.
  Over the last 1-2 years we removed a lot of uaIDs from the
  script, though they didn't visibly destroy the job pages (
  because we have no pagination), accessing them directly
  would show broken icons and links as the IDs were no longer
  registered. Fixed by running --find-unknown, adding them in
  the userAgents index, and then running interactive
  --replace-unknown to replace them everywhere.
BrowserInfo: Clean up and update browser icons.

Removed redundant sizes. We only use 1 size.

Updated to the latest version, from:
* Chrome, Chromium, Firefox, IE, IE8, Opera, Safari, WebKit:
  https://github.com/paulirish/browser-logos

* Firefox Mobile:
  http://mozillalinks.org/2008/07/meet-the-fennec-logo/
  http://mxr.mozilla.org/mobile-browser/source/branding/nightly/content/logo.png
  http://mxr.mozilla.org/mobile-browser/source/branding/nightly/content/logo.png?raw=1

Loosely trimmed all logos (keeping it still properly centred, such
as the IE logo) and shrunk down to cover 128x128. Then ran through
ImageOptim.app.
Inject: Report filepath/linenr in onerror handling.
jshintignore: Add inc/libs/

Various errors from inc/libs/ua-parser/*/**.js