Implement timestamp behavior

closes #2215
Allow for use with any event

By allowing the behavior to act on any event, it's possible to easily
cater for soft delete (deleted_date) or any kind of custom event
(approval_date, rejection_date, published_date)
merge get+set timestamp

and change possible $when values to "always" "new" "existing"
add a test that the timestamp is current

allowing 3 seconds to prevent off-by-one-second errors
add an integration test
use array_fill_keys instead of a manual loop
don't save users from themselves

If the behavior config is changed such that it triggers an undefined
index error - don't silently swallow that
whitespace corrections
throw an exception for invalid $when values
invert assertSame parameters
Merge pull request #2275 from AD7six/3.0-timestamp

Implement timestamp behavior
Step one for moving implementedMethods logic

A behavior should be responsible for saying what methods it implements
allow configuring implmenetedMethods/Finders
allow behavior method aliasing

and change the way finders are stored to remove the find prefix
add test expectations for implementedMethods/Finders
reflection method cache should be static

I.e. apply to all instances of the same behavior class
Minor corrections/simplifications
explicitly define callable methods

It's an easy-win performance gain (by avoiding the use of reflections)
don't force strtolower in implemented* behavior methods

Since it's a public function don't leave open the possibility that
though configuration it doesn't "work" due to case changes. In the
behavior class, return without case manipulation - take care of that in
the behavior registry class.

Also add documentation for implemented* methods
use array_key_change_case and restructure cache

by consistently changing key case, when asking a behavior for which
methods it implements, a few strtolower calls can be avoided.

Using static::$_cacheProperty gets confused as it is shared by all
subclasses... so index the cache by class name.