Add Persistence extensibility per storage type

With NServiceBus Azure transport, persistence for Subscriptions and Timeouts could be done to different Azure storage tables. It was achieved through the following code:
```c#
 var bus = Configure.With()
                        .DefaultBuilder()
                        .UseTransport<AzureServiceBus>(() => connectionString)
                        .AzureSubscriptionStorage(connectionString, createTable, tableName)
                        .UnicastBus();
```
With NSB V5 we have switched to use `PersistenceExtensions<T>`, where `T` is a transport defined `PersistenceDefinition`.
Unfortunately, ability to customize persistence per storage type (`Sagas`, `Timeouts`, `Subscriptions`) was lost when moved to V5 leaving customers with XML config file or `IProvideConfiguration<T>` workaround ([NServiceBus.Azure issue #213](https://github.com/Particular/NServiceBus.Azure/issues/213)).

This pull-request is an attempt to add persistence extensibility per storage type into V5. Sample above would be implemented as
```c#
config.UsePersistence<AzureStoragePersistence>();
config.UsePersistence<AzureStoragePersistence, StorageType.Subscriptions() // override settings for Subscriptions only
          .ConnectionString(connectionString)
          .TableName(tableName)
          .CreateSchema(createSchema);
```
and transports would allow extensibility as the following NServiceBus.Azure sample snippet:
```c#
    public static class ConfigureAzureSubscriptionStorage
    {
        public static PersistenceExtentions<AzureStoragePersistance, StorageType.Subscriptions> ConnectionString(this PersistenceExtentions<AzureStoragePersistance, StorageType.Subscriptions> extentions, string connectionString)
        {
			// register connection string to use for keeping subscriptions when Azure storage persistence is used
			
            return extentions;
        } 

        public static PersistenceExtentions<AzureStoragePersistance, StorageType.Subscriptions> TableName(this PersistenceExtentions<AzureStoragePersistance, StorageType.Subscriptions> extentions, string tableName)
        {
			// register table name to use for keeping subscriptions when Azure storage persistence is used
			
            return extentions;
        } 
        
public static PersistenceExtentions<AzureStoragePersistance, StorageType.Subscriptions> CreateSchema(this PersistenceExtentions<AzureStoragePersistance, StorageType.Subscriptions> extentions, bool createSchema)
        {
			// register if table should be created for keeping subscriptions when Azure storage persistence is used
			
            return extentions;
        } 
    }
```

@Particular/nservicebus & @Particular/azure please review/comment. Thank you.
ok then

On 27 November 2014 at 11:25, Sean Feldman <notifications@github.com> wrote:

> In src/NServiceBus.Core/Persistence/StorageType.cs:
>
> > @@ -0,0 +1,33 @@
> > +﻿namespace NServiceBus.Persistence
> > +{
> > +    /// <summary>
> > +    /// The storage types used for NServiceBus needs
> > +    /// </summary>
> > +    public abstract class StorageType
> > +    {
> > +        /// <summary>
> > +        /// Storage for timeouts
> > +        /// </summary>
> > +        public class Timeouts : StorageType { }
>
> Sealed doesn't allow extending it. Why would we want to limit newing it
> up? It's an empty class.
> Plus, static class can only inherit from object and we want to inherit
> from StorageType.
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/Particular/NServiceBus/pull/2587/files#r20974310>.
>