Since the metadata only provides a date, set the time part to 12:00:00
(UTC).
Also fix up the deprecation warning for the creation of the initial zero
last build timestamp.
This newer version is able to correctly parse the date of streamed
videos.
Also use the full `ytextract::Video` structs which should have have all
the metadata.
This way handlers don't need to do case matching on backend ID strings
anymore.
* Rename `backend` to `backend_id` where we have a backend ID
* Add `get` function and `Backends` enum to the `backend` module
* Add a depend on the `enum_dispatch` crate
* Add a `backend` module `Backend` trait and necessary abstract types
* Refactor handlers to use the back-end abstraction
* Directly serialize to URLs where necessary in Mixcloud back-end
* Require `serde` feature for the url crate
* The feed item limit defaults to the default page size (50) if not
provided
* Move caching from response to URL fetch results; add helper functions
* Add a helper function to set the paging query of an URL
* Modify paging so we don't retrieve more than the feed item limit
* Derserialize the paging information
* Parse each next URL; handle URL parse errors
* Use a default page size of 50; pass offset 0 to count by item index
* Enable the `async` feature for the `cached` crate
* Make the types that we cache implement `Clone`
* Rename the argument of mixcloud::redirect_url` because of this issue:
https://github.com/jaemk/cached/issues/114
* Use the `thiserror` crate to make our own error type
* Implement Rocket's `Responder` type for the error type
* Adjust all methods to use the error type
* Small documentation tweaks