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