zink: rework zink_context->program_cache to match more accurately
when shaders are created and destroyed in large numbers, the same pointers get reused for different shaders, which can lead to bad lookups in this hash table. performing a deeper hash/compare resolves this at the expense of more time reading and comparing shader memory
fixes #3053 (closed)