'update item inside a node
:param node: node in form of list, or BLANK_NODE
:param key: nibble list without terminator
.. note:: key may be []
:param value: value string
:return: new node
if this node is changed to a new node, it\'s parent will take the
responsibility to *store* the new node storage, and delete the old
node storage'

def _update(self, node, key, value):

    node_type = self._get_node_type(node)
    if (node_type == NODE_TYPE_BLANK):
        o = [pack_nibbles(with_terminator(key)), value]
        self._encode_node(o)
        return o
    elif (node_type == NODE_TYPE_BRANCH):
        if (not key):
            node[(-1)] = value
        else:
            new_node = self._update_and_delete_storage(self._decode_to_node(node[key[0]]), key[1:], value)
            node[key[0]] = self._encode_node(new_node)
            self._delete_node_storage(new_node)
        self._encode_node(node)
        return node
    elif is_key_value_type(node_type):
        return self._update_kv_node(node, key, value)
