block_pinned could be better re-implemented with a single new column in block_instance, just for increased simplicity alone.
To implement roles in sticky blocks we need to make them have some sort of context. See
About the contexts, it's a bit tricky to think about since the one "instance" appears site-wide within various other contexts, and so may inherit different permissions from the various parent contexts. Do we process all this like a normal block, effectively treating each place it appears as a sort of virtual instance?
Or are pinned blocks an exception to heirarchy rules, with their own context under SYSTEM level?