Optional: forward declarations of stream operators.

The issue comes from implicit convertion optional<T> -> bool.
Subtle bugs might occur when invoking operator<< (or operator>>)
with no boost/optional/optional_io.hpp included. E.g.:

  #include <iostream>
  #include <boost/optional.hpp>

  int main() {
      boost::optional<std::string> foo("2");
      std::cout << foo << std::endl;
  }

will print '1' to the console as far as 'foo' object is implicitly
converted to bool, and therefore '1' indicates that 'foo' holds
actual data.

Instead the following code

  #include <iostream>
  #include <boost/optional.hpp>
  #include <boost/optional/optional_io.hpp>

  int main() {
      boost::optional<std::string> foo("2");
      std::cout << foo << std::endl;
  }

will print ' 2' because the appropriate
ostream& operator << (ostream& s, optional<T> const&) is called.

To avoid such bugs forward declaration of stream operators is
introduced. Hence code from the first example will not be able to compile
without explicit inclusion of boost/optional/optional_io.hpp.