libsync: Add safer abstraction for SPSC queue.

The current spsc implementation doesn't enforce single-producer
single-consumer usage and also allows unsafe memory use through
peek & pop.

For safer usage, `new` now returns a pair of owned objects which
only allow consumer or producer behaviors through an `Arc`.
Through restricting the mutability of the receiver to `mut` the
peek and pop behavior becomes safe again, with the compiler
complaining about usage which could lead to problems.

To fix code broken from this, update:
Queue::new(x) -> unsafe { Queue::unchecked_new(x) }

[breaking-change]

For an example of broken behavior, check the added test which uses the unchecked constructor.
There is currently not much precedent for a constructor of the form `T::new() -> (U, V)` where the return type is completely different from `T`. I would recommend taking the same approach as channels and have a top-level `queue()` or `pair()` function returning the tuple.

Our current [naming conventions](http://aturon.github.io/features/functions-and-methods/input.html) for a function such as this would mean that the "unchecked" modifier in the constructor below is out of place, and the function would be best named `new` s well (if this one was renamed).