Deleting jobs

This PR adds a job deletion feature. There is a new state – `DeletedState`, and some methods to perform the deletion – `BackgroundJob.Delete` and `IBackgroundJobClient.Delete`. When you are using these methods, a job is not being actually deleted, there is only state transition. Jobs in the deleted state expire after some delay (as succeeded jobs).

The operation does not provides guarantee that the job will not be performed. If you deleting a job that is performing right now, it will be performed anyway, despite of calls to delete methods.

**Usage**

If you want to delete job despite its current state, do the following:

```csharp
var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
BackgroundJob.Delete(jobId);

// or
IBackgroundJobClient client = new BackgroundJobClient();
client.Delete(jobId);
```

If you want to be able to handle only deletion from exact state, for example, only from `FailedState` (because it may change after you click and before it will be deleted), you can specify it:

```csharp
var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
BackgroundJob.Delete(jobId, FailedState.StateName);

// or
IBackgroundJobClient client = new BackgroundJobClient();
client.Delete(jobId, ScheduledState.StateName);
```