Support shared futures on no_std
Currently, Shared futures are only available when the std feature is enabled because they use std::sync::Mutex internally. This PR changes this so that Shared futures will fall back to using a spinlock when std is not enabled.
Alternatively, Shared could be changed to be generic over a mutex trait (e.g. lock_api::RawMutex, though it isn't implemented for std::sync::Mutex) to allow arbitrary user implementations.
Thanks for the PR. I would prefer not to use spinlock by default around operations that would involve allocations even if it is no_std-only.
That said, it might be fine if this is an optional feature and spinlock is used only when std is disabled and the feature is explicitly enabled.
I moved the spinlock behind an optional spin feature that will use a spinlock when std is disabled.