As a followup, after some wiki reading, I'm using Quest Aliases, and I almost have it working. The main roadblock right now is that I get an OnInit() event when an alias is "attached" to a (Book) ObjectReference, but I don't get any event when the alias is "detached".
Well presuming that your own code is doing the "detatching", it should know when it's doing it, right? If you save some information on the connection, you should be able to do the equivalent of making your own "event"
Unfortunately there's no equivalent of a New() constructor for abstract object types in papyrus. You can't just make an object with no model, you need to use a PlaceAtMe() function instead. I ran into that issue trying to implement a linked list in Papyrus...it ain't easy. They mention "linked References" in the documentation, but you can't use a script to SET them (though there are plenty of Get and Count functions), so if you want a fully usable linked list, you have to implement it yourself.