Migrate to proper Python unittests

NOTE: this reduces visibility into the actual protocol, as debugging
output is captured by the internal buffering for validation. Future work
may add an output log feature for improved analysis.