Pre-set the bytes property when creating a new StringObj, since it's known at that time and saves a call to UpdateString later
Add deferred-cleanup for objs that reach 0 refcount.  This is not just a performance optimization - it's needed for correctness: sometimes objects go to refcount 0 transiently while they are being returned from some command, and will be added to a variable or otherwise picked up and incref'ed.  Without this the object is freed before the receiver gets a chance to take ownership.