Fix issue with Kernel#silence_stream leaking file descriptors

Calling Kernel#silence_stream creates a new file descriptor which isn't
closed after it is used. As a result calling silence_stream multiple
times leads to a build up of loose file descriptors and can cause issues
in environments where garbage collection isn't run often.

The test I added which checks the object space is a bit slow (takes around 4ms on my machine for the one test). Any suggestions to improve this would be appreciated.