API Better declaration of DataObject field change levels.
Use of const named identifiers to represent each change level rather than numbers.
Merge pull request #2524 from tractorcow/pulls/3.2-change-level-identifiers

API Better declaration of DataObject field change levels.
Making cacheToFile  key more resilient against mixed/nested types
API: LookupField::Field now returns an HTMLText instance.

Moved LookupField into a template, removed getSource() as the DropdownField getSource() has been simplified to just a getter
API: Change DropdownField::getSource() to not return the emptyString value.
BUG FailedLoginCount reset

If you fail your maximum login attempts and are locked out, further failed login attempts add to your already existing FailedLoginCount as it is only reset if you log in successfully. This means that if you're locked out, then try again, one failure will automatically lock you out again, regardless of what you set your max limit to.

Example:

lock_out_after_incorrect_logins: 3
FailedLoginCount: 0

The user fails three login attempts.

lock_out_after_incorrect_logins: 3
FailedLoginCount: 3

The user is now locked out.

Lockout time passes.

The user fails their 4th login.

lock_out_after_incorrect_logins: 3
FailedLoginCount: 4

This will continue to happen until the user successfully logs in, without giving them the pre-defined amount of login attempts again due to this condition being met after every incorrect login:
```php
if($this->FailedLoginCount >= self::config()->lock_out_after_incorrect_logins) {
```

FailedLoginTestCount Test Added
Merge pull request #2561 from TomSpeak/patch-3

BUG FailedLoginCount reset
Merge pull request #2559 from willmorgan/cachetofile-arguments

Making cacheToFile  key more resilient against mixed/nested types