pickler: escape string that have special meaning when used as dictionary key

When keys=True, jsonpickle currently encodes

    In [1]: original = {'json://6': 6}

    In [2]: encode(original, keys=True)
    Out[2]: '{"json://6": 6}'

which when reconstituted becomes:

    In [3]: decode(encode(original, keys=True), keys=True)
    Out[3]: {6: 6}

This pull request changes the JSON string to:

    In [1]: original = {'json://6': 6}

    In [2]: encode(original, keys=True)
    Out[2]: '{"json://\\"json://6\\"": 6}'

which would be correctly reconstituted to:

    In [3]: decode(encode(original, keys=True), keys=True)
    Out[3]: {'json://6': 6}

Refer to #90
It's probably better to write this conditional as `elif self.keys and k.startswith(tags.JSON_KEY):` so we can avoid the string ops in the non-keys case.

Actually, it might be worth swapping the conditional above it to `isinstance()` instead of `not isinstance()` so that the conditional can be a positive/affirmative test and do the `if self.keys` test in there instead. That might read better.

It also occurred to me that we don't have any tests with `{None: None}` as an input. With `keys=True` we do the right thing but this change would break that.

That said, our behavior under `keys=False` with `{None: None}` seems suboptimal because the `json` module does a better thing and gives us `{"null": null}` versus jsonpickle `{"None": null}` because of our string coercion here.

@lieryan I'll add a test case that exercises `{None: None}` so that you can rebase and include that test when adjusting this MR.