Since apparently closing stdin and later calling communicate() is no bueno,
we're just going to rearrange the process finalization code so both cleanup()
and the pipe loop exit conditions point to it.
Due to an oversight that has existed since the very beginning, the pipe
argument has been broken since there was nothing to actually write
the data to the process's stdin. Now there is.
Also josh made me add typings blegh
Add stream option and command so we don't always have to download a file
Move repeated voice check code to before_invoke hook
Add typing indicators when making YTDLSources
`keep_alive` was not defined until it was created in `received_message`, `ws` is `None` until its actually connected, which doesn't always happen. If an error happens before things start up properly, the client should now clean its objects up (fixes `unclosed client session` warning).