zink: program rewrite part 1
this fixes a bunch of issues we have regarding program lifetimes (e.g., if an app performs a draw, deletes shaders, then performs more draws without any flush occurring) as well as preparing us for future work here to implement shader keys and further improve slot remapping