Merge branch 'projects-4'

== Project system ==

The old situation lead to a user table containing a messy mix of
passwordless "client" accounts, unused accounts with passwords
from people using "signup", and "project" accounts that submit
jobs. This blurry distinction has been made strict now.
Nobody can sign up from the web anymore.
To join the swarm for test running, simply join directly
(which is how it was already), clients take a free form text
field as their "name", which doesn't have any account attached
to it (there is nothing clients can do other than run tests).
To create a "project" account for job submission, run the
manageProject.php script from the command line, which returns
the auth token (which you previously had to manually get from the db).

== Changes ==

Database:
* Table 'projects' replaces old 'users' table.
* Removed various SQL `default` attributes that were confusing
  and unneeded.
* Removed foreign key restrictions.

API:
* Query parameters for authentication changed from:
  - authUsername (users.name)
  - authToken (users.auth)
  to:
  - authID (projects.id)
  - authToken (projects.auth_token)
* SignupAction: Removed, no longer used.

Pages:
* ProjectPage: (NEW) Based on the "Recent jobs" section of UserPage.
  - New: Timestamp of each job.
  - New: Pagination.
* ProjectsPage: Not changed much. Except that it can now really
  query all projects, instead of running a query against
  various tables and list all project-like user accounts.
  - New: Summary of latest job (a bit like Jenkins).
* ClientsPage: (NEW) Shows online clients (sortable by name
  or latest ping, option to group by name).
* ClientPage: (NEW) Information about a run client:
  - Browser info.
  - When it connected, last pinged.
  - Log of what it has done and/or is currently doing.
* SignupPage: Removed, no longer used.
* ScorePage: Removed, in favour of ClientsPage/mode=users.

Scripts
* manageProject.php: (NEW) To create and alter projects in the
  database from the command line.

Misc:
* Auth object is now managed inside TestSwarmContext (instead of
  being accessed globally directly from the session).
  This made it possible to fix #181, and cleaned up some duplication.
* Fix various documentation comments for consistency
  - @param type $name
  - "authAction: Required"

References:
* fixes #72: Implement ClientsAction (show online clients)
* fixes #148: Refactor users/clients relationship and add projects
* fixes #171: Add pagination to ProjectPage
* fixes #181: Session continuation should validate that account
  still exists and is the same
* fixes #248: Show status of latest job on ProjectsPage

== Migration log ==
 - SQL  jobs.user_id              > jobs.project_id
 - SQL  client.user_id            > (del)
 - SQL  (new)                     > client.name
 - PHP  UserAction                > ProjectAction | ClientAction
 - PHP  UserPage                  > ProjectPage | ClientPage
 - PHP  SignupAction              > manageProject.php | LoginAction
 - PHP  SignupPage                > (del) | scripts/manageProject.php
 - PHP  ScoresAction              > (del) | ClientsAction
 - PHP  ScoresPage                > (del) | ClientsPage
 - URL  /user/$1                  > /project/$1 | /client/$1
 - URL  /signup                   > (del) | scripts/manageProject.php
 - URL  /scores                   > (del) | /clients/?mode=users
 - API  Project.userName          > Project.info.display_title
 - API  Job.ownerName             > Job.projectID
 - API  Job.creation              > Job.created
 - API  Job.name                  > Job.nameHtml | Job.nameText
 - API  Projects.name             > Projects.displayTitle
 - API  Projects.jobCount         > (del)
 - API  User.recentJobs           > Project.jobs
 - API  User.uasInJobs            > Project.userAgents
 - API  User.recentJobs#url       > Project.jobs#info.viewUrl
 - API  User.recentJobs#uaSummary > Project.jobs#summaries
 - API  Result.resultInfo         > Result.info
 - API  Result.client.userID      > (del)
 - API  Result.client.userName    > Result.client.name
 - API  Result.client.useragent   > Result.client.uaRaw
 - API  Result.client.userUrl     > Result.client.viewUrl
 - JS   SWARM.user                > SWARM.auth
Action: Update parameter documentation

Return value of Action::getError always contains
a non-empty 'info' property, it hasn't been optional
for a while now.
ProjectAction: Move project creation logic out of cli script
dbUpdate: Add migration for 'users-projects-conversion'

Tested by installing master and project-4 in separate dbs.
Then checking out project-4 with the master database
configured and running dbUpdate.php.

Ran a diff on the mysqldump to confirm. Following diff has
become empty:

    $ mysqldump --skip-comments --skip-extended-insert --skip-add-drop-table --no-data -u root -p swarm_master > swarm_master_updated.skip.nodata.sql
    $ mysqldump --skip-comments --skip-extended-insert --skip-add-drop-table --no-data -u root -p swarm_projects4 > swarm_projects4.skip.nodata.sql
    $ diff -u swarm_master_updated.skip.nodata.sql swarm_projects4.skip.nodata.sql
    $
dbUpdate: Don't migrate accounts with no jobs

The old setup allowed public creation of accounts. As such
there can be a lot of accounts that aren't intended to be
'projects'.

This uses the same condition we used to have in ProjectsAction
to show only "project"-like accounts.
TestSwarmContext: Fix undefined 'gitHead' in calculateVersionInfo

If the git repo is in a detached state, the 'else' clause is
used where $gitHead doesn't exist yet. Should reference
$gitHeadFileCnt instead.
MaintenanceScript: Remove unused logic for required options
dbUpdate: Fix logic error in 9f4f6b1

Database::query only returns false if the query failed.
If it didn't fail but yielded 0 results it still returns
a valid MySqlResource object (which are alway truthy,
even if there is nothing to fetch).

Using Database::getOne instead, since mysql_fetch_* will
return false if there resource is empty.
scripts: Implement REPL for TestSwarm environment
Clean up of various documentation comments

Made require_once reference absolute path instead of
relative path (like is already done in the other entr points).

Moved instantiation of TestSwarmContext to after init of
PHP settings. There were a few PHP errors at some point in
the past that were hard to catch due to them occurring before
the setting of error_reporting.