Make TaintedHash more hash like

The original TaintedHash implementation had the following issuses:

* `TaintedHash#merge` acted like `TaintedHash#merge!`
* `TaintedHash#fetch` and `TaintedHash#values_at` returned values directly from `@original_hash` instead of going through `get_original_hash_value` , which ensures all values are appropriately wrapped in a TaintedHash if appropriate.
* `TaintedHash#update` didn't expose the passed in key/values.  `TaintedHash#update` should likely work similarly to `[]=`.

This pull request fixes the issues identified, though it could possible lead to breakage for code depending on/working around the prior behavior.

/CC @mastahyeti @gregose