Pipeline instrumentation

The idea is to add instrumentation to the execution of each instance of the pipeline.
I've implemented this using the `IObservable`.

### Features of the instrumentation
- Duration for each behavior execution.

### Testing code
The following code is a test bed for this extension points:
```c#
class RegisterDiagnostics : IWantToRunWhenBusStartsAndStops 
{
    public BusNotifications BusNotifications { get; set; }

    private IDisposable receiveStartedUnsubscribe;

    public void Start()
    {
        receiveStartedUnsubscribe = BusNotifications.Pipeline.ReceiveStarted
            .SubscribeOn(Scheduler.Default)
            .Subscribe(OnReceiveStarted,
                ex =>
                {
                    Console.WriteLine("An error occurred: {0}", ex);
                },
                () => Console.WriteLine("OnReceiveEnded"));
    }

    int sessionIdCounter;

    private void OnReceiveStarted(IObservable<StepStarted> stepStartedStream)
    {
        new Run(Interlocked.Increment(ref sessionIdCounter), stepStartedStream);
    }

    public void Stop()
    {
        receiveStartedUnsubscribe.Dispose();
    }
}

class Run
{
    private int numberOfSpacesToIndent = 1;

    public Run(int sessionId, IObservable<StepStarted> stepStartedStream)
    {
        Console.Out.WriteLine("{0} Run Started", sessionId);

        stepStartedStream.Subscribe(started => new Step(started, sessionId, numberOfSpacesToIndent++), () => Console.Out.WriteLine("{0} Run Ended", sessionId));
    }
}

class Step
{
    private Type behavior;
    private string stepId;
    private TimeSpan duration = TimeSpan.Zero;
    private Exception exception;
    private int sessionId;
    private string spaces;

    public Step(StepStarted started, int id, int numberOfSpacesToIndent)
    {
        behavior = started.Behavior;
        stepId = started.StepId;
        sessionId = id;

        spaces = new string(' ', numberOfSpacesToIndent);

        Console.WriteLine(Header());

        started.Ended.Subscribe(ended => duration = ended.Duration,
            ex =>
            {
                exception = ex;
                Console.WriteLine(Footer());
            }
            , () => Console.WriteLine(Footer()));
    }

    string Header()
    {
        return String.Format("{3}{0}) [{1}] {2}", sessionId, stepId, behavior.FullName, spaces);
    }

    string Footer()
    {
        if (exception == null)
        {
            return String.Format("{3}{0}) [{1}] {2:g}ms", sessionId, stepId, duration, spaces);
        }
        return String.Format("{3}{0})[{1}] {2}", sessionId, stepId, exception.GetType(), spaces);
    }
}
```

### Examples of output
Session with single message:
```
1 Run Started
 1) [AuditProcessedMessage] NServiceBus.AuditBehavior
  1) [ProcessingStatistics] NServiceBus.ProcessingStatisticsBehavior
   1) [CreateChildContainer] NServiceBus.ChildContainerBehavior
    1) [ExecuteUnitOfWork] NServiceBus.UnitOfWorkBehavior
     1) [ProcessSubscriptionRequests] NServiceBus.SubscriptionReceiverBehavior
      1) [MutateIncomingTransportMessage] NServiceBus.ApplyIncomingTransportMess
ageMutatorsBehavior
       1) [DeserializeMessages] NServiceBus.DeserializeLogicalMessagesBehavior
        1) [InvokeRegisteredCallbacks] NServiceBus.CallbackInvocationBehavior
         1) [ExecuteLogicalMessages] NServiceBus.ExecuteLogicalMessagesBehavior
          1) [MutateIncomingMessages] NServiceBus.ApplyIncomingMessageMutatorsBe
havior
           1) [LoadHandlers] NServiceBus.LoadHandlersBehavior
            1) [SetCurrentMessageBeingHandled] NServiceBus.SetCurrentMessageBein
gHandledBehavior
             1) [InvokeHandlers] NServiceBus.InvokeHandlersBehavior
              1) [EnforceBestPractices] NServiceBus.SendValidatorBehavior
               1) [MutateOutgoingMessages] NServiceBus.MutateOutgoingMessageBeha
vior
                1) [PopulateAutoCorrelationHeadersForReplies] NServiceBus.Popula
teAutoCorrelationHeadersForRepliesBehavior
                 1) [CreatePhysicalMessage] NServiceBus.CreatePhysicalMessageBeh
avior
                  1) [SerializeMessage] NServiceBus.SerializeMessagesBehavior
                   1) [MutateOutgoingTransportMessage] NServiceBus.MutateOutgoin
gPhysicalMessageBehavior
                    1) [DispatchMessageToTransport] NServiceBus.DispatchMessageT
oTransportBehavior
                    1) [DispatchMessageToTransport] 0:00:00.0049581ms
                   1) [MutateOutgoingTransportMessage] 0:00:00.0019532ms
                  1) [SerializeMessage] 0:00:00.00265ms
                 1) [CreatePhysicalMessage] 0:00:00.0014519ms
                1) [PopulateAutoCorrelationHeadersForReplies] 0:00:00.0003742ms
               1) [MutateOutgoingMessages] 0:00:00.0004219ms
              1) [EnforceBestPractices] 0:00:00.0008408ms
                     1) [LicenseReminder] NServiceBus.LicenseBehavior
                     1) [LicenseReminder] 0:00:00.0002861ms
             1) [InvokeHandlers] 0:00:00.0231674ms
            1) [SetCurrentMessageBeingHandled] 0:00:00.0001377ms
                      1) [SetCurrentMessageBeingHandled] NServiceBus.SetCurrentM
essageBeingHandledBehavior
                       1) [InvokeHandlers] NServiceBus.InvokeHandlersBehavior
                        1) [EnforceBestPractices] NServiceBus.SendValidatorBehav
ior
                         1) [MutateOutgoingMessages] NServiceBus.MutateOutgoingM
essageBehavior
                          1) [PopulateAutoCorrelationHeadersForReplies] NService
Bus.PopulateAutoCorrelationHeadersForRepliesBehavior
                           1) [CreatePhysicalMessage] NServiceBus.CreatePhysical
MessageBehavior
                            1) [SerializeMessage] NServiceBus.SerializeMessagesB
ehavior
                             1) [MutateOutgoingTransportMessage] NServiceBus.Mut
ateOutgoingPhysicalMessageBehavior
                              1) [DispatchMessageToTransport] NServiceBus.Dispat
chMessageToTransportBehavior
                              1) [DispatchMessageToTransport] 0:00:00.0002404ms
                             1) [MutateOutgoingTransportMessage] 0:00:00.0000959
ms
                            1) [SerializeMessage] 0:00:00.0000422ms
                           1) [CreatePhysicalMessage] 0:00:00.0000398ms
                          1) [PopulateAutoCorrelationHeadersForReplies] 0:00:00.
0000118ms
                         1) [MutateOutgoingMessages] 0:00:00.0000351ms
                        1) [EnforceBestPractices] 0:00:00.0000153ms
                               1) [LicenseReminder] NServiceBus.LicenseBehavior
                               1) [LicenseReminder] 0:00:00.0000126ms
                       1) [InvokeHandlers] 0:00:00.012451ms
                      1) [SetCurrentMessageBeingHandled] 0:00:00.0000071ms
           1) [LoadHandlers] 0:00:00.0033033ms
          1) [MutateIncomingMessages] 0:00:00.0005921ms
         1) [ExecuteLogicalMessages] 0:00:00.0145309ms
        1) [InvokeRegisteredCallbacks] 0:00:00.0006817ms
       1) [DeserializeMessages] 0:00:00.0047335ms
      1) [MutateIncomingTransportMessage] 0:00:00.0009438ms
     1) [ProcessSubscriptionRequests] 0:00:00.0017392ms
    1) [ExecuteUnitOfWork] 0:00:00.0009643ms
   1) [CreateChildContainer] 0:00:00.0027005ms
  1) [ProcessingStatistics] 0:00:00.000763ms
 1) [AuditProcessedMessage] 0:00:00.0062596ms
1 Run Ended
```

Session with 2 messages processing in parallel:
```
1 Run Started
2 Run Started
 1) [AuditProcessedMessage] NServiceBus.AuditBehavior
 2) [AuditProcessedMessage] NServiceBus.AuditBehavior
  2) [ProcessingStatistics] NServiceBus.ProcessingStatisticsBehavior
  1) [ProcessingStatistics] NServiceBus.ProcessingStatisticsBehavior
   2) [CreateChildContainer] NServiceBus.ChildContainerBehavior
   1) [CreateChildContainer] NServiceBus.ChildContainerBehavior
    2) [ExecuteUnitOfWork] NServiceBus.UnitOfWorkBehavior
    1) [ExecuteUnitOfWork] NServiceBus.UnitOfWorkBehavior
     2) [ProcessSubscriptionRequests] NServiceBus.SubscriptionReceiverBehavior
     1) [ProcessSubscriptionRequests] NServiceBus.SubscriptionReceiverBehavior
      2) [MutateIncomingTransportMessage] NServiceBus.ApplyIncomingTransportMess
ageMutatorsBehavior
      1) [MutateIncomingTransportMessage] NServiceBus.ApplyIncomingTransportMess
ageMutatorsBehavior
       2) [DeserializeMessages] NServiceBus.DeserializeLogicalMessagesBehavior
       1) [DeserializeMessages] NServiceBus.DeserializeLogicalMessagesBehavior
        1) [InvokeRegisteredCallbacks] NServiceBus.CallbackInvocationBehavior
        2) [InvokeRegisteredCallbacks] NServiceBus.CallbackInvocationBehavior
         1) [ExecuteLogicalMessages] NServiceBus.ExecuteLogicalMessagesBehavior
         2) [ExecuteLogicalMessages] NServiceBus.ExecuteLogicalMessagesBehavior
          1) [MutateIncomingMessages] NServiceBus.ApplyIncomingMessageMutatorsBe
havior
          2) [MutateIncomingMessages] NServiceBus.ApplyIncomingMessageMutatorsBe
havior
           1) [LoadHandlers] NServiceBus.LoadHandlersBehavior
           2) [LoadHandlers] NServiceBus.LoadHandlersBehavior
            2) [SetCurrentMessageBeingHandled] NServiceBus.SetCurrentMessageBein
gHandledBehavior
            1) [SetCurrentMessageBeingHandled] NServiceBus.SetCurrentMessageBein
gHandledBehavior
             2) [InvokeHandlers] NServiceBus.InvokeHandlersBehavior
             1) [InvokeHandlers] NServiceBus.InvokeHandlersBehavior
              1) [EnforceBestPractices] NServiceBus.SendValidatorBehavior
              2) [EnforceBestPractices] NServiceBus.SendValidatorBehavior
               2) [MutateOutgoingMessages] NServiceBus.MutateOutgoingMessageBeha
vior
               1) [MutateOutgoingMessages] NServiceBus.MutateOutgoingMessageBeha
vior
                2) [PopulateAutoCorrelationHeadersForReplies] NServiceBus.Popula
teAutoCorrelationHeadersForRepliesBehavior
                1) [PopulateAutoCorrelationHeadersForReplies] NServiceBus.Popula
teAutoCorrelationHeadersForRepliesBehavior
                 2) [CreatePhysicalMessage] NServiceBus.CreatePhysicalMessageBeh
avior
                 1) [CreatePhysicalMessage] NServiceBus.CreatePhysicalMessageBeh
avior
                  1) [SerializeMessage] NServiceBus.SerializeMessagesBehavior
                  2) [SerializeMessage] NServiceBus.SerializeMessagesBehavior
                   2) [MutateOutgoingTransportMessage] NServiceBus.MutateOutgoin
gPhysicalMessageBehavior
                   1) [MutateOutgoingTransportMessage] NServiceBus.MutateOutgoin
gPhysicalMessageBehavior
                    2) [DispatchMessageToTransport] NServiceBus.DispatchMessageT
oTransportBehavior
                    1) [DispatchMessageToTransport] NServiceBus.DispatchMessageT
oTransportBehavior
                    1) [DispatchMessageToTransport] 0:00:00.0050335ms
                   1) [MutateOutgoingTransportMessage] 0:00:00.0019098ms
                  1) [SerializeMessage] 0:00:00.0027163ms
                 1) [CreatePhysicalMessage] 0:00:00.0012628ms
                    2) [DispatchMessageToTransport] 0:00:00.0050607ms
                   2) [MutateOutgoingTransportMessage] 0:00:00.0020041ms
                  2) [SerializeMessage] 0:00:00.0026993ms
                 2) [CreatePhysicalMessage] 0:00:00.0012715ms
                2) [PopulateAutoCorrelationHeadersForReplies] 0:00:00.0003694ms
               2) [MutateOutgoingMessages] 0:00:00.0005877ms
              2) [EnforceBestPractices] 0:00:00.0008566ms
                1) [PopulateAutoCorrelationHeadersForReplies] 0:00:00.0006126ms
               1) [MutateOutgoingMessages] 0:00:00.0005337ms
              1) [EnforceBestPractices] 0:00:00.0009726ms
                     1) [LicenseReminder] NServiceBus.LicenseBehavior
                     2) [LicenseReminder] NServiceBus.LicenseBehavior
                     1) [LicenseReminder] 0:00:00.0002056ms
             1) [InvokeHandlers] 0:00:00.0245491ms
            1) [SetCurrentMessageBeingHandled] 0:00:00.0000785ms
                     2) [LicenseReminder] 0:00:00.0002119ms
             2) [InvokeHandlers] 0:00:00.0245132ms
            2) [SetCurrentMessageBeingHandled] 0:00:00.0001377ms
                      1) [SetCurrentMessageBeingHandled] NServiceBus.SetCurrentM
essageBeingHandledBehavior
                       1) [InvokeHandlers] NServiceBus.InvokeHandlersBehavior
                        1) [EnforceBestPractices] NServiceBus.SendValidatorBehav
ior
                      2) [SetCurrentMessageBeingHandled] NServiceBus.SetCurrentM
essageBeingHandledBehavior
                         1) [MutateOutgoingMessages] NServiceBus.MutateOutgoingM
essageBehavior
                          1) [PopulateAutoCorrelationHeadersForReplies] NService
Bus.PopulateAutoCorrelationHeadersForRepliesBehavior
                           1) [CreatePhysicalMessage] NServiceBus.CreatePhysical
MessageBehavior
                       2) [InvokeHandlers] NServiceBus.InvokeHandlersBehavior
                            1) [SerializeMessage] NServiceBus.SerializeMessagesB
ehavior
                             1) [MutateOutgoingTransportMessage] NServiceBus.Mut
ateOutgoingPhysicalMessageBehavior
                        2) [EnforceBestPractices] NServiceBus.SendValidatorBehav
ior
                         2) [MutateOutgoingMessages] NServiceBus.MutateOutgoingM
essageBehavior
                          2) [PopulateAutoCorrelationHeadersForReplies] NService
Bus.PopulateAutoCorrelationHeadersForRepliesBehavior
                           2) [CreatePhysicalMessage] NServiceBus.CreatePhysical
MessageBehavior
                            2) [SerializeMessage] NServiceBus.SerializeMessagesB
ehavior
                             2) [MutateOutgoingTransportMessage] NServiceBus.Mut
ateOutgoingPhysicalMessageBehavior
                              2) [DispatchMessageToTransport] NServiceBus.Dispat
chMessageToTransportBehavior
                              1) [DispatchMessageToTransport] NServiceBus.Dispat
chMessageToTransportBehavior
                              2) [DispatchMessageToTransport] 0:00:00.000178ms
                             2) [MutateOutgoingTransportMessage] 0:00:00.0000434
ms
                            2) [SerializeMessage] 0:00:00.0000169ms
                           2) [CreatePhysicalMessage] 0:00:00.0000232ms
                          2) [PopulateAutoCorrelationHeadersForReplies] 0:00:00.
0000035ms
                         2) [MutateOutgoingMessages] 0:00:00.000011ms
                        2) [EnforceBestPractices] 0:00:00.0000055ms
                               2) [LicenseReminder] NServiceBus.LicenseBehavior
                               2) [LicenseReminder] 0:00:00.000009ms
                       2) [InvokeHandlers] 0:00:00.0046676ms
                              1) [DispatchMessageToTransport] 0:00:00.0001172ms
                             1) [MutateOutgoingTransportMessage] 0:00:00.0000548
ms
                            1) [SerializeMessage] 0:00:00.000026ms
                           1) [CreatePhysicalMessage] 0:00:00.0000292ms
                          1) [PopulateAutoCorrelationHeadersForReplies] 0:00:00.
0000075ms
                         1) [MutateOutgoingMessages] 0:00:00.0000197ms
                        1) [EnforceBestPractices] 0:00:00.0000102ms
                               1) [LicenseReminder] NServiceBus.LicenseBehavior
                      2) [SetCurrentMessageBeingHandled] 0:00:00.0000015ms
           2) [LoadHandlers] 0:00:00.0024218ms
          2) [MutateIncomingMessages] 0:00:00.0004654ms
                               1) [LicenseReminder] 0:00:00.0000078ms
                       1) [InvokeHandlers] 0:00:00.0084391ms
         2) [ExecuteLogicalMessages] 0:00:00.0138441ms
        2) [InvokeRegisteredCallbacks] 0:00:00.0006754ms
       2) [DeserializeMessages] 0:00:00.0044714ms
      2) [MutateIncomingTransportMessage] 0:00:00.0007926ms
                      1) [SetCurrentMessageBeingHandled] 0:00:00.0000023ms
     2) [ProcessSubscriptionRequests] 0:00:00.0011957ms
    2) [ExecuteUnitOfWork] 0:00:00.0005645ms
           1) [LoadHandlers] 0:00:00.0030048ms
          1) [MutateIncomingMessages] 0:00:00.0006047ms
         1) [ExecuteLogicalMessages] 0:00:00.0136933ms
        1) [InvokeRegisteredCallbacks] 0:00:00.0006809ms
       1) [DeserializeMessages] 0:00:00.004739ms
      1) [MutateIncomingTransportMessage] 0:00:00.0006963ms
     1) [ProcessSubscriptionRequests] 0:00:00.0012486ms
    1) [ExecuteUnitOfWork] 0:00:00.0006221ms
   1) [CreateChildContainer] 0:00:00.0009833ms
  1) [ProcessingStatistics] 0:00:00.0004543ms
   2) [CreateChildContainer] 0:00:00.0018877ms
  2) [ProcessingStatistics] 0:00:00.0004938ms
 2) [AuditProcessedMessage] 0:00:00.0037415ms
 1) [AuditProcessedMessage] 0:00:00.0045989ms
1 Run Ended
2 Run Ended
```

Session with an exception:
```
1 Run Started
 1) [AuditProcessedMessage] NServiceBus.AuditBehavior
  1) [ProcessingStatistics] NServiceBus.ProcessingStatisticsBehavior
   1) [CreateChildContainer] NServiceBus.ChildContainerBehavior
    1) [ExecuteUnitOfWork] NServiceBus.UnitOfWorkBehavior
     1) [ProcessSubscriptionRequests] NServiceBus.SubscriptionReceiverBehavior
      1) [MutateIncomingTransportMessage] NServiceBus.ApplyIncomingTransportMess
ageMutatorsBehavior
       1) [DeserializeMessages] NServiceBus.DeserializeLogicalMessagesBehavior
        1) [InvokeRegisteredCallbacks] NServiceBus.CallbackInvocationBehavior
         1) [ExecuteLogicalMessages] NServiceBus.ExecuteLogicalMessagesBehavior
          1) [MutateIncomingMessages] NServiceBus.ApplyIncomingMessageMutatorsBe
havior
           1) [LoadHandlers] NServiceBus.LoadHandlersBehavior
            1) [SetCurrentMessageBeingHandled] NServiceBus.SetCurrentMessageBein
gHandledBehavior
             1) [InvokeHandlers] NServiceBus.InvokeHandlersBehavior
              1) [EnforceBestPractices] NServiceBus.SendValidatorBehavior
               1) [MutateOutgoingMessages] NServiceBus.MutateOutgoingMessageBeha
vior
                1) [PopulateAutoCorrelationHeadersForReplies] NServiceBus.Popula
teAutoCorrelationHeadersForRepliesBehavior
                 1) [CreatePhysicalMessage] NServiceBus.CreatePhysicalMessageBeh
avior
                  1) [SerializeMessage] NServiceBus.SerializeMessagesBehavior
                   1) [MutateOutgoingTransportMessage] NServiceBus.MutateOutgoin
gPhysicalMessageBehavior
                    1) [DispatchMessageToTransport] NServiceBus.DispatchMessageT
oTransportBehavior
                    1) [DispatchMessageToTransport] 0:00:00.0050738ms
                   1) [MutateOutgoingTransportMessage] 0:00:00.0020251ms
                  1) [SerializeMessage] 0:00:00.0027352ms
                 1) [CreatePhysicalMessage] 0:00:00.0013216ms
                1) [PopulateAutoCorrelationHeadersForReplies] 0:00:00.0003994ms
               1) [MutateOutgoingMessages] 0:00:00.0004638ms
              1) [EnforceBestPractices] 0:00:00.0010291ms
                     1) [LicenseReminder] NServiceBus.LicenseBehavior
                     1) [LicenseReminder] 0:00:00.0002455ms
             1) [InvokeHandlers] 0:00:00.0263519ms
            1) [SetCurrentMessageBeingHandled] 0:00:00.0001369ms
                      1) [SetCurrentMessageBeingHandled] NServiceBus.SetCurrentM
essageBeingHandledBehavior
                       1) [InvokeHandlers] NServiceBus.InvokeHandlersBehavior
                       1)[InvokeHandlers] System.Exception
                      1)[SetCurrentMessageBeingHandled] System.Exception
           1)[LoadHandlers] System.Exception
          1)[MutateIncomingMessages] System.Exception
         1)[ExecuteLogicalMessages] System.Exception
        1)[InvokeRegisteredCallbacks] System.Exception
       1)[DeserializeMessages] System.Exception
      1)[MutateIncomingTransportMessage] System.Exception
     1)[ProcessSubscriptionRequests] System.Exception
    1)[ExecuteUnitOfWork] System.Exception
   1)[CreateChildContainer] System.Exception
  1)[ProcessingStatistics] System.Exception
 1)[AuditProcessedMessage] System.Exception
```


Why double-check lock here? `lookupSteps` is an instance field and `PopulateLookupTable` is called only once, in the constructor.