Changes:
* Change the casting code to be const correct.  Now, doing this is invalid:
     const Value *V = ...;
     Instruction *I = dyn_cast<Instruction>(V);
  instead, the second line should be:
     const Instruction *I = dyn_cast<Instruction>(V);

* Change the casting code to allow casting a reference value thus:
     const Value &V = ...;
     Instruction &I = cast<Instruction>(V);

  dyn_cast does not work with references, because it must return a null pointer
  on failure.

* Fundamentally change how instructions and other values are represented.
  Before, every llvm container was an instance of the ValueHolder template,
  instantiated for each container type.  This ValueHolder was effectively a
  wrapper around a vector of pointers to the sub-objects.

  Now, instead of having a vector to pointers of objects, the objects are
  maintained in a doubly linked list of values (ie each Instruction now has
  Next & Previous fields).  The containers are now instances of ilist (intrusive
  linked list class), which use the next and previous fields to chain them
  together.  The advantage of this implementation is that iterators can be
  formed directly from pointers to the LLVM value, and invalidation is much
  easier to handle.

* As part of the above change, dereferencing an iterator (for example:
  BasicBlock::iterator) now produces a reference to the underlying type (same
  example: Instruction&) instead of a pointer to the underlying object.  This
  makes it much easier to write nested loops that iterator over things, changing
  this:

    for (Function::iterator BI = Func->begin(); BI != Func->end(); ++BI)
      for (BasicBlock::iterator II = (*BI)->begin(); II != (*BI)->end(); ++II)
        (*II)->dump();

  into:

    for (Function::iterator BI = Func->begin(); BI != Func->end(); ++BI)
      for (BasicBlock::iterator II = BI->begin(); II != BI->end(); ++II)
        II->dump();

  which is much more natural and what users expect.

* Simplification of #include's: Before, it was necessary for a .cpp file to
  include every .h file that it used.  Now things are batched a little bit more
  to make it easier to use.  Specifically, the include graph now includes these
  edges:
    Module.h -> Function.h, GlobalVariable.h
    Function.h -> BasicBlock.h, Argument.h
    BasicBlock.h -> Instruction.h

  Which means that #including Function.h is usually sufficient for getting the
  lower level #includes.

* Printing out a Value* has now changed: Printing a Value* will soon print out
  the address of the value instead of the contents of the Value.  To print out
  the contents, you must convert it to a reference with (for example)
  'cout << *I' instead of 'cout << I;'.  This conversion is not yet complete,
  but will be eventually.  In the mean time, both forms print out the contents.

* References are used much more throughout the code base.  In general, if a
  pointer is known to never be null, it is passed in as a reference instead of a
  pointer.  For example, the instruction visitor class uses references instead
  of pointers, and that Pass subclasses now all receive references to Values
  instead of pointers, because they may never be null.

* The Function class now has helper functions for accessing the Arguments list.
  Instead of having to go through getArgumentList for simple things like
  iterator over the arguments, now the a*() methods can be used to access them.

