Reimplement Latch with Celluloid::Condition

This reimplements the Latch class used by Celluloid::IO::Stream to
perform atomic writes even when a given Stream is being shared among
multiple Celluloid tasks.

The new implementation uses Conditions instead of the (now deprecated)
signal mechanism. This should improve performance.

In addition, conditions are only used when there is actual contention on
a given Stream, which should improve performance.