Defines fields and bytes as union in TObject

Issue: #34
Refactors TArray<T>::operator[] to eliminate unsafe cast

FreeBSD complains that cast in TArray::operator[] may
break aliasing rules due to access through badly aliased pointers.

Linux port of GCC on the other hand do not complain.
However we need to eliminate this potential problems.

This commit slightly modifies the template parameter from T* to T.
Also C-style cast is changed to C++ cast.

Note:
    Current implementation uses reinterpret_cast but technically
    static_cast should be OK. Adding static_cast forces compiler
    to complain that the cast is invalid.

    TArray<T> is expected to be specialized with descendants
    of TObject as T. Therefore static_cast from TObject* to T* should
    be considered safe. But it isn't probably due to template nature.

    Needs more investigation though.

Issue: #34
Fixes TArray<T>::operator[]

The previous implementation used reinterpret_cast which is type-unsafe.
Now the compiler throws error if you try to instantiate TArray<int> and
use operator[].

Issue: #34
Merge remote-tracking branch 'origin/bug/34/strict_aliasing' into develop

* origin/bug/34/strict_aliasing:
  Fixes TArray<T>::operator[]
  Refactors TArray<T>::operator[] to eliminate unsafe cast
  Defines fields and bytes as union in TObject

Conflicts:
	include/memory.h

Issue: #34