ToDo:

v2.1.0 Add RegularTimeSeries with special "find" methods (that would be very fast)
    - Stores timestamps as a reange and values as a raw vector
        - timestamps are of type StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}
        - values are just a plain vector with no timestamps
    - getindex returns the constructed TimeRecord
    - setindex! on a timerecord only works if the timestamp matches exactly
    - `timeseries(t, v)` will return RegularTimeSeries if t is an abstract range
        - Can also use interpolation/averaging on other timeseries to construct new timeseries if "v" is a timeseries
        - timeseries(t::AbstractRange, v::AbstractTimeSeries; order=0, method=interpolation)
        - averaging will produce one less element, and the "timestamp" assigned to an average is the end (to prevent "future contamination")
    - Change the hierarchy:
        - AbstractTimeSeries
            - AbstractRegularTS
                - RegularTimeseries, RegularTimeseriesView

v2.1.1 Add filtering functions
    - First-order lowpass filter 
    - First-order detrender (forgetful sum of diff)
    - double-filter for no phase lag


v2.1.2 Add documentation


Plot Recipe notes (in case of improvements):
    - https://docs.juliaplots.org/latest/RecipesBase/syntax/
    - potential solution:
        @recipe f(ts::TimeSeries; use_dates=true) = use_dates ? (datetimes(ts), values(ts)) : (timestamps(ts), values(ts))
    - more advanced functionality (potetially resolution, and you definitely want rotation)
        https://discourse.julialang.org/t/plots-with-formatted-datetime-xticks/48649