Robot rules

My unofficial hackathon project :)

Will allow us to dynamically decide what we want to do with jobs -- for now clear, retry, retry, retry with incrementing the retry attempt count extra. Criteria include job class, error class, error message, etc.,and a possible expiry so we don't become dependent on it.

Silo peeps: it can also be used in conjunction with Swappable to send BSC jobs to the API if processing them normally fails with a certain error.

Be aware that this is a public PR.

I still have to add a couple tests but wanted people to see this before the weekend.

@davidann @tony-bye

`retrying?` is supposed to return a boolean value, right?  As I understand this currently, the only way this will return `false` is if `val` is `nil`? Is that intended?