Initial 'Observations'

In order to construct decision trees we must have some way of
programatically representing 'decisions', but these decisions are really
just observations of mathematical relationships; Therefore we represent
observations as wrappers of a specific relation which has members
representing which component of a Vector they represent.

Using a simple notation somewhat similar to MongoDB's expression
notation:

A B C D - capital letters are a Vector component index (int)
a b c d - lowercase letters are constant values (doubles), with the
exception of:
eq - equal to
neq - not equal to
gt - greater than
gte - greater than or equal to
lt - less than
lte - less than or equal to
pl - plus
mi - minus
mu - multiply
di - divide

Note that Observations can essentially be used statically (referential
equality single instantiation), and since they are intended to be used
as keys in a dictionary (or hashset, for set operations), we again
override the hash code to short to 0 forcing it to fall to the equality
operator which understands it's own type and will also match it's
properties intelligently for value equality. Since observations are
congruent if equal.