text: Title: DotDict behaves inconsistent on equality checks. `x == y` != `not x != y` and not `x != y` == `not x == y`
  Body: As found in #4955 `==` and `!=` do behave differently on DotDict.
  
  While `==` behaves like `dict` the `!=` does behave like OrderedDict.
  
  Quote:
  This `not a == b` vs `a != b` was the reason the utest fail in the branch.
  And i would consider this an actual bug in DotDict implementation?
  
  
  ```python
  from collections import OrderedDict
  from robot.utils import DotDict
  
  # Normal dict: the order isn't relevant
  norm_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7}
  norm_dict_reverse = {'g': 7, 'f': 6, 'e': 5, 'd': 4, 'c': 3, 'b': 2, 'a': 1}
  
  norm_dict == norm_dict_reverse    # True
  norm_dict != norm_dict_reverse    # False
  not norm_dict == norm_dict_reverse    # False
  not norm_dict != norm_dict_reverse    # True
  
  # OrderedDict: the order is important
  order_dict = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5), ('f', 6), ('g', 7)])
  order_dict_reverse = OrderedDict([('g', 7), ('f', 6), ('e', 5), ('d', 4), ('c', 3), ('b', 2), ('a', 1)])
  
  order_dict == order_dict_reverse    # False
  order_dict != order_dict_reverse    # True
  not order_dict == order_dict_reverse    # True
  not order_dict != order_dict_reverse    # False
  
  #DotDict : the order isn't relevant with == but is relevant with !=
  dot_dict = DotDict({'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7})
  dot_dict_reverse = DotDict({'g': 7, 'f': 6, 'e': 5, 'd': 4, 'c': 3, 'b': 2, 'a': 1})
  dot_dict == dot_dict_reverse    # True because order is not relevant with ==
  dot_dict != dot_dict_reverse    # True because order is relevant with !=
  not dot_dict == dot_dict_reverse    # False
  not dot_dict != dot_dict_reverse    # False
  ```
  
  This also appears in Robot Framework Usage:
  
  DotDict
  ![image](https://github.com/robotframework/robotframework/assets/41592183/19adc29d-88ca-4eea-b121-5f08f5e39492)
  
  OrderedDict
  ![image](https://github.com/robotframework/robotframework/assets/41592183/e35dce29-5552-4f97-9181-45933f672416)
  
  Normal python dict
  ![image](https://github.com/robotframework/robotframework/assets/41592183/5d6444be-10ff-4d2a-a995-a2e9cffa0abc)
  
  
  Fix should just be adding this to DotDict:
  ```python    
      def __ne__(self, other):
          return not self == other
  ```
  
  I think it is easiest if you quickly add this and a test for it yourself.