Begin implementing abstract platform

The API and return values of channels are more consistent if everything is `Result<Success, Error>`. If you're calling `try_recv` then an empty channel is arguable the same class of error as a disconnected channel. Standardizing all methods on this pattern provides better readability for code as well as easier understandability.