Removed the Systems code for the time being while I explore alternative designs.

Rework of the engine's Windowing code.
* The event handling method for Window has changed.
  The public Signals have been removed from Window.
  Windows now have .peekEvent(), .getEvent(), and .pushEvent() methods that take/return WindowEvent objects.
* A WindowEvent object contains an enum indicating what type of event it represents, and a union of
  event-specific structs holding detailed information about the event.
* Window now fully delegates to an internal WindowImpl object (e.g. WindowsWindow, LinuxWindow, etc),
  and WindowImpl objects now inherit from a new class, BaseWindowImpl.
  These changes have fixed the circular dependency that previously existed between Window and WindowImpl.
* Window objects are now NonCopyable. Added move-constructor and move-assignment operators.
* Added .getHandle() method to Window. Returns a WindowHandle, which varies according to the underlying implementation.
* .setAutoClose() and .getAutoClose() were removed; auto-close didn't account for external dependencies on the windows (e.g. OpenGL context).
* Thread-safety issue with m_windowMap in WindowsWindow fixed

Key and MouseButton enums / related functions were moved out of WindowEvent and into their own files.

Added new functions dealing with intersections between Bounds, as well as unit tests for these functions.
* a.intersects( b ) returns true if a and b are intersecting, false otherwise.
* a.intersects_EE( b ) is similar, but is edge exclusive; i.e. a and b are NOT considered intersecting if they only intersect on an edge/face/corner/etc.
* intersect( a, b ) returns the intersection portion of two Bounds. If two bounds are not intersecting, the result is undefined.

Added BoundsStack and MatrixStack.
* These classes are stacks with operations specialized for their respective types.
* MatrixStack's .pushMultiply( matrix ) method multiplies the given matrix against the top matrix and pushes the result.
* BoundsStack's .pushIntersect( bounds ) method intersects the given bounds against the top bounds and pushes the result.

Added UntypedThreadLocal and ThreadLocal to make working with thread-local storage (TLS) easier.

Added .isFunction( name ) to LuaInstance.
* Returns true if there is a global function named "name", false otherwise.
* Code that previously threw exceptions if attempting to access a function that didn't exist now uses .isFunction() instead.

Added Stopwatch, a class for measuring how much time has passed between two points in time.
* Uses the highest-precision clock available to the system.
* Contains two methods, .reset() and .get().
* .reset() sets the begin time to the current time.
* .get() returns the duration between the begin time and current time (in seconds)
  and returns it as a double. Additionally, the begin time is set to the current time, as if .reset() were called.

IFactory wasn't declared as part of the Brimstone namespace - whoops! Fixed.