I have found that simply opening sockets , pipes or serial ports and "fconfigure -translation binary -blocking 0 -buffering none" and using event driven I/O in regular Tcl to be superior. You use this same pattern for all activity, which makes things more consistent.
I haven't spent any hands-on time with it yet, but what I've read so far is what led me to start learning more about expect, and Tcl in general. I'm looking for a robust way to test the systems I'm building with docker: machine, compose (fig), swarm, etc.