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