job alert refactoring to stop ui freezes

- less blocking, more thread safety
- alert types can return arbitrary error messages on a per-job
  basis when an alert has multiple jobs configured
- clear emails would get dropped when going from N>1 active job
  alerts to a different M>0 where one or more of N had cleared
- use json + codec to automagically parse JobAlerts as a parameter
  type for AlertResource.putAlert
- tons of refactoring and other clean-up

smaller future items should be breaking up JobAlert into sub-classes
and probably sending e-mails on a per-job basis rather than a
per-alert basis.