Removing duplicate code and keeping File API consistent
API DateTime.Ago better infers significance of date units.
BUG Fixes missing i18n translation in Date::TimeDiffIn
BUG Fixes Date::TimeDiffIn not respecting mocked SS_Datetime::now
This provides less vague date periods. I.e. "36 days" has a lot more relevance that "1 month"
Reduced duplication of time period calculation code
(ref: CWPBUG-141)
BUG Fix versioned
Versioned is not writing Version to _version tables for subclasses of Version dataobjects which have their own DB fields
- Fix disjoint of ID / RecordID (which should be the same)
- Fix calculation of new record version
- Fix use of empty vs !isset to check for existing version
Refactor / Cleanup Versioned
API Allow parameterised joins / subselects
Merge pull request #3490 from tractorcow/pulls/3.2/parameterised-joins

API Allow parameterised joins / subselects
API Cookies set via Cookie::set() are now HTTP only by default
Merge pull request #3505 from halkyon/cookie_httponly

Cookies set via Cookie::set() are now HTTP only by default
Merge pull request #3462 from tractorcow/pulls/3.2/fix-versioned

BUG Fix versioned failing to generate new versions
API Convert::html2raw no longer wraps text automatically
BUG Convert::html2raw now correctly decodes single quotes
API Mailer can be configured to use different encoding mechanisms, and added support for unicode quoted-string encoding
API Mailer bounce email can now be configured
API Mailer no longer calls Convert::xml2raw on all email subjects
API Deprecate dead Mailer code and refactored duplicate or mis-documented code.
Merge pull request #3025 from tractorcow/pulls/3.2-date-relevance

API DateTime.Ago better infers significance of date units.
API Singleton method allowing type inference
This pattern improves over the current usage of singleton by allowing type inference.
This also better supports refactor, code usage detection, and auto-completion of classes.
Merge pull request #3007 from tractorcow/pulls/singleton

API Singleton method allowing type inference
Merge pull request #3507 from tractorcow/pulls/fix-mailer

API / FIX / Cleanup - Mailer and Convert::html2raw
Merge pull request #3407 from dhensby/pulls/file-link

Removing duplicate code and keeping File API consistent
BUG ErrorControlChain now supports exception handling
Merge pull request #3512 from tractorcow/pulls/3.2/exceptions

BUG ErrorControlChain now supports exception handling
NEW Cookie_Backend for managing cookie state

I've decoupled `Cookie` from the actual act of setting and getting
cookies. Currently there are a few limitations to how Cookie works that
this change mitigates:

0. `Cookie` currently changes the super global `$_COOKIE` when setting
to make the state of an application a bit more managable, but this is
bad because we shouldn't be modifying super globals
0. One can't actually change the `$cookie_class` once the
`Cookie::$inst` has been instantiated
0. One can't test cookies as there is no class that holds the state of
the cookies (it's just held in the super global which is reset as part
of `Director::test()`
0. One can't tell the origin of a cookie (eg: did the application set it
and it needs to be sent, or did we receive it from the browser?)
0. `time()` was used, so testing was made difficult
0. There was no way to get all the cookies at once (without accessing
the super global)

Todos are on the phpdoc and I'd like to write some tests for the backend
as well as update the docs (if there are any) around cookies.
DOCS Adding `Cookie` docs

Explains basic usage of `Cookie` as well as how the `Cookie_Backend`
controls the setting and getting of cookies and manages state of sent vs
received cookies
Fixing `Cookie` usage

`Cookie` is being used inconsistently with the API throughout framework.
Either by not using `force_expiry` to expire cookies or setting them to
null and then expiring them (which is redundant).
NEW `Director::test()` takes `Cookie_Backend` rather than `array` for `$cookies` param
Suggested improvements / test case fixes