Extra detail on the implications of `SystemDefinitions`:

Because `SystemDefinitions` unconditionally returns ```System` ``` for everything, all symbols in builtin rules are in ```System` ```, even if they don't end up with an actual definition (for instance, pattern variables).

Once we're finished parsing the builtin rules, we use the real definitions, and there `lookup_name` only counts builtins or symbols defined by the user. That means the system symbols we create don't spill over into the user environment. For example, `Subtract` is defined as `Subtract[x_, y_] -> Plus[x, Times[-1, y]]`, which is internally ```System`Subtract[System`x_, System`y_] -> System`Plus[System`x, System`Times[-1, System`y]```, but once the definitions are switched over, you can't see ```System`x``` any more:
```
In[1]:= Context[Subtract]
Out[1]= System`

In[2]:= Context[x]
Out[2]= Global`
```

Something else that's important: In Mathematica, just mentioning a symbol causes it to be created and then it immediately counts for context lookup and `Names`, but this patch set doesn't implement that at the moment:
```
In[1]:= Context[blah]
Out[1]= Global`

In[2]:= System`blah
Out[2]= blah

In[3]:= Context[blah]
Out[3]= Global`

In[4]:= System`blah = 34;
In[5]:= SetAttributes[Context, HoldFirst]   (* it should have this already, oops, I'll fix that *)
In[6]:= Context[blah]
Out[6]= System`
```
The main problem is that symbols are just created whenever we need them, and there's no central record of which symbols exist. I think we can make this work by adding empty definitions whenever we see a new undefined symbol, which might let us fully implement things like `Names` and `Remove` as well.