Reconsider the use of guards for the socket API
The socket API uses guard types when setting deadlines, and when the guard is dropped the deadline is cleared. The idea behind this is to prevent lingering deadlines.
In practise this can lead to some annoying issues. First, every type wrapping around a socket might want its own deadline guard, depending on what it needs a deadline for. Second, if a socket is moved and somehow dropped earlier than the guard (i.e. it's moved into a type that's then dropped before the guard), you get a panic as this would result in a use-after-free.
The usual approach is that when you use deadlines, you set a new deadline at the start of a "transaction", thus you wouldn't run into lingering deadlines. We should probably just remove the guard types entirely.