bugfix - merge mismatch

Previously, merging  mismatched types would cause odd behavior in some cases. Consider merging these two objects:

```js
// original
{ foo: [] }
// other
{ foo: "bar" }
```

In this case, the `foo` key would end up with an array containing "b", "a", and "r" because the other value would be treated as an object/array for merging.

This change gives special treatment to non-object non-array values when merging. They overwrite their counterparts in the original object.

There are also additional tests for related cases that pass without change, but assert the behavior is correct.