I think consolidating KeepAlive TimeSpan logic into this class makes more sense than putting it into the already large Connection class.

Ex:
```CSharp

    public KeepAliveData(double timeoutSeconds)
    {
		// Timeout to designate when to force the connection into reconnecting
		KeepAliveData.Timeout = TimeSpan.FromSeconds(timeoutSeconds);
		
		// Timeout to designate when to warn the developer that the connection may be dead or is hanging.
		KeepAliveData.TimeoutWarning = TimeSpan.FromTicks(KeepAliveData.Timeout.Ticks * _keepAliveWarnAt);

		// Instantiate the frequency in which we check the keep alive.  It must be short in order to not miss/pick up any changes

		KeepAliveData.CheckInterval = TimeSpan.FromTicks((KeepAliveData.Timeout.Ticks - KeepAliveData.TimeoutWarning.Ticks) / 3);
    }

    public DateTime LastKeepAlive { get; set; }
    public TimeSpan Timeout { get; private set; }
    public TimeSpan TimeoutWarning { get; private set; }
    public TimeSpan CheckInterval { get; private set; }
```