Using garetjax/phpbrowscap as user agent parser

- Using garetjax/phpbrowscap as user agent parser
 * Added third party lib to ./inc/libs
 * Refactor BrowserInfo class and updating callers

- Deleted `useragents` database table
 * `useragent_id` database columns are no longer a foreign key integer,
   converted to a varchar(40). Corresponding to the keys in useragents.ini
 * Updating queries to insert the useragents.ini key
 * str_queryf var for useragent_id is now `%s` instead of `%u`
 * Deleted unused `clients.os` databale column

- Adding ./cache directory
 * Forbid access from web with .htacess Deny from all
 * Location configurable from testswarm.ini

- A few changes that occurred as result of using a different parser:
 * generic "mobile safari/xxx" -> iPhone x.x
 * generic "mobile safari/xxx" -> iPad x.x
 * SymbianOS Series 60 -> Opera Mini 2
 * webOS 1.4 browser -> Palm Web 1.0
 * Windows Mobile 7 -> IEMobile 7.0

- Bugs addressed:
 * [issue #143] Refactor useragent storage and detection
 * Android 1.5 and 1.6 now matched separately
 * [issue #47] Android 2.3.2 matched as 2.2

- Source of ./inc/libs/GaretJax-phpbrowscap:
 * https://github.com/garetjax/phpbrowscap
 * https://github.com/GaretJax/phpbrowscap/tags (v1.0)
 * https://github.com/GaretJax/phpbrowscap/commit/54f3e9ed318f4b5ce735d93fadac2e9f3718dde8

- Misc:
 * HomePage: Removed unused $prevEngine variable
 * Removed unused browser icons
 * Merged ./img with ./images
   Choosing img as destination because that's where the bootstrap css files
   point to.
 * Simplified ./config/.htaccess to simply Deny from all unconditionally
[issue #143] Convert SwarmstateAction to use new user agent system

- Misc:
 * Client.php: Added additional check to verify that the
   client_id's user agent matches the User-Agent of the
   browser that made the request.
[issue #143] Clean up

- Removed unused browser icons
- Removed old useragents.sql
[issue #143] Convert UserPage to new user agent system

- Misc
 * Add "unknown" browser icon
 * Also show Platform under "Active browsers" on UserPage
 * Fixed bug in Client.php:
  - use the same value for ->update
    as in the UPDATE query, if query() takes a > 1 second the timestamps
    would differ.
  - drop left over %s from when `client.os` row existed
Separate [client]refresh_control setting into one external and internal.

- The ini value is for modification by the administrator who
  manages the swarm instance
- The internal value in init.php is for changes we make in the software.
- Bumped internal to 2
Turn more hardcoded time values into ini settings
Rename a few of the new 0.3 settings to match naming style
Lower cooldown_sleep between runs

- Lower cooldown_sleep between runs to speed up average testswarm job
  completion time.

- Keeping the loop times during inactivity the same for now, as that
  could significantly increase the number of requests to the server.
  Just lowering the cooldown so that the requests that are made
  anyway are done a little quicker.
(issue #82) Fix bug in HomePage from twitter bootstrap integration
[issue #143] Convert UserPage to new user agent system + Implement FauxRequestContext

- Extracted the logic into UserAction (issue #132)

- Dropped support for the ?job= parameter that functioned as a primitive
  search filter for certain job names, but was kinda useless since
  it stripped out characters commonly found in job names (such as numbers
  and full-stops) and even then, job names are sorted by creation,
  and then mysql_queryf escapes some parts.

  Could be easily (re)implemented "the right way" over in the UserAction.
  Anyone interested may create an issue for it.

- Converted BrowserInfo::getBrowscap() into an array with a known set of
  properties instead of blindly passing the original object which has many
  other properties that should not be used.

- DerivativeWebRequest, Context::createDerivedRequestContext
 * New class that takes query parameters and POST boolean
   and creates a fake Context object derived from the given
   context object. Used to use JobAction inside UserAction.

- Fixed #13 (again). This made it visible that status-new should be grey
  and status-notscheduled white (which is how it was before twitter bootstrap)

- Added json_decode/json_encode normalization to Action::setData.
  This way all Action responses contain associative arrays and never
  objects.

- Poke #137, using <div class="alert alert-error"> for error messages.
Implement ApiDebugPage and add web-entry protections

- Previously when one accessed utilities.php or init.php
  there would be a fatal error and leaving stuff unfinished.
clean up whitespace
Fix syntax error
(issue #146) Add robots index / follow rules
Remove 500 code header from ApiDebugPage and bogus `open` file (follows up a04207cd054de7133a07bd557fd8d6eb6c635ef6)
escape-for-html var_dump on ApiDebugPage (follows up a04207cd054de7133a07bd557fd8d6eb6c635ef6)
Use SwarmstateAction on HomePage instead of ad-hoc queries

- While at it, made use of the other info that SwarmstateAction
  provides such as pendingRuns.

  Browsers that are not in the swarm and have pending runs
  assigned are now indicated with a red label.
Fix opera bug in useragents.ini

- Fixing MinorVer Opera 11.10 not 11.1
  11.1 < 11.5 < 11.6 < 11.10 < 11.50

- Follows-up f5905d7a0bdb3be3da7a21f5d1ea556d47ba426a
Style update

- Default UserPage message as "info" msg instead of "alert" msg

- Font-size slightly smaller on HomePage so that the labels fit
  in Opera as well.
Fix E_NOTICE if setError() is incorrectly called